gpt4 book ai didi

java - 如何使用Java遍历类及其成员类的对象

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:28:41 26 4
gpt4 key购买 nike

我正在尝试获取一个类 (objectfactory.java) 的所有数据对象(单独的变量,而不是它的函数等),并且调用本身创建实例的方法同一包中的其他类,这样,就可以列出给定包中所有类中的所有对象。 (从正确的角度来看,这些是由 JAXB 创建的类)。

也就是说,我基本上想要做的是,遍历并列出所有数据对象:

Objectfactory, and then,
- Person
- Name
- Url
- Link
- Personnel

类。

这是 objectFactory 类:

@XmlRegistry
public class ObjectFactory {

private final static QName _Given_QNAME = new QName("", "given");
private final static QName _Email_QNAME = new QName("", "email");
private final static QName _Family_QNAME = new QName("", "family");

/**
* Create a new ObjectFactory that can be used to create new instances of schema derived classes for package: schema
*
*/
public ObjectFactory() {
}
public Person createPerson() {
return new Person();
}

public Name createName() {
return new Name();
}

public Url createUrl() {
return new Url();
}

public Link createLink() {
return new Link();
}

public Personnel createPersonnel() {
return new Personnel();
}

@XmlElementDecl(namespace = "", name = "given")
public JAXBElement<String> createGiven(String value) {
return new JAXBElement<String>(_Given_QNAME, String.class, null, value);
}
@XmlElementDecl(namespace = "", name = "email")
public JAXBElement<String> createEmail(String value) {
return new JAXBElement<String>(_Email_QNAME, String.class, null, value);
}

@XmlElementDecl(namespace = "", name = "family")
public JAXBElement<String> createFamily(String value) {
return new JAXBElement<String>(_Family_QNAME, String.class, null, value);
}

}

我只能直接直到使用 Java Reflections.(getDeclaredFields()) 等的 ObjectFactory 中的字段和方法。

但是,对于其他类,我只能手动到达它们的对象。(例如,对于类链接)

ObjectFactory factory= new ObjectFactory();
Field[] fields = factory.createLink().getClass().getDeclaredFields();

Field[] fields1 = factory.createPerson().getClass().getDeclaredFields();

for (Field f1 : fields1) {
System.out.println("field name = " + f1.getName());
}

但是,我想在运行时为 objectfactory 中的所有类执行此操作,而不是通过调用“createPerson()”之类的方法手动执行此操作。

我试过这样做;

ObjectFactory factory= new ObjectFactory();
Method[] methods = factory.getClass().getDeclaredMethods();
for (Method m : methods) {
System.out.println("Class name = " + m.getName());
Field[] subfields = m.getClass().getDeclaredFields();


for (Field sf : subfields) {
System.out.println("entities = " + sf.getName());
}
System.out.println("\n\n");

}

但这行不通。

我期望的输出是这样的:

Class name = ObjectFactory
field name = _Given_QNAME
field name = _Email_QNAME
field name = _Family_QNAME

Class name = Person
field name = Name
field name = Age
field name = Sex

Class name = Personnel
field name = address
...

等等..

我该怎么做?

最佳答案

public void getAllClassAndFields() {
ObjectFactory objectFactory = new ObjectFactory();
Method[] methods = objectFactory.getClass().getDeclaredMethods();
for (Method method : methods) {
try {
// Check if method have XmlElementDecl annotation
XmlElementDecl annotation = method.getAnnotation(XmlElementDecl.java);
if (annotation == null) {
// Invoke method only if it is not annoatated with XmlElementDecl
Object object = method.invoke(objectFactory, new Object[] {});
System.out.println("Class Name = " + object.getClass().getName());
printFileds(object);
}

} catch (Exception e) {
// I used Exception to keep it simple, instead use appropriate exception types here
}
}
}

public static void printFileds(Object obj) {
Field[] fields = obj.getClass().getFields();
for (Field field : fields) {
System.out.println("Field Name = " + field.getName());
}
}

关于java - 如何使用Java遍历类及其成员类的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17738817/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com