如何使用 Java 遍历类的对象及其成员类
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/17738817/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
How to iterate through the objects of a class and its member classes using Java
提问by VictorCreator
I'm trying to get all the data objects(variables alone, not its functions et al) of one class (objectfactory.java) and also, invoke the methods in itself, that create instances of other classes in the same package, and this way, make a list of all the objects in all the classes in a given package. (to put things in perspective, these are classes created by JAXB).
我试图获取一个类 ( objectfactory.java) 的所有数据对象(单独的变量,而不是它的函数等),并且还调用本身的方法,这些方法在同一包中创建其他类的实例,这样,给定包中所有类中所有对象的列表。(从正确的角度来看,这些是由 JAXB 创建的类)。
That is, what I basically want to do is, iterate through, and make a list of all the data objects of:
也就是说,我基本上想要做的是,遍历并列出以下所有数据对象:
Objectfactory, and then,
- Person
- Name
- Url
- Link
- Personnel
classes.
类。
Here is the objectFactory class:
这是 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);
}
}
I could go directlyonly until the fields and methods in ObjectFactory using Java Reflections.(getDeclaredFields()) etc.
我只能直接使用 Java Reflections.(getDeclaredFields()) 等直到 ObjectFactory 中的字段和方法。
But, for the other classes, I can only manually reach their objects. (For eg, for Class Link)
但是,对于其他类,我只能手动访问它们的对象。(例如,对于类链接)
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());
}
but, I want to do this at runtime for all the classes in objectfactory, and not manually by making calls like "createPerson()".
但是,我想在运行时为 objectfactory 中的所有类执行此操作,而不是通过像“createPerson()”这样的调用手动执行此操作。
I tried doing something like this;
我尝试做这样的事情;
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");
}
But this doesn't work.
但这不起作用。
My expected output would be something like this:
我的预期输出将是这样的:
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
...
and so on..
等等..
How do I do this?
我该怎么做呢?
采纳答案by xyz
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());
}
}
回答by Seabook
Not sure why do you want to do this?
But try the code below
不知道你为什么要这样做?
但是试试下面的代码
public class RelectionTestCases {
public static final String INDENT = " ";
public static void main(String[] args) throws IllegalArgumentException, IllegalAccessException, InvocationTargetException {
ObjectFactory factory = new ObjectFactory();
Field[] fields = ObjectFactory.class.getDeclaredFields();
// Fields
System.out.println(ObjectFactory.class.getName());
for (Field field : fields) {
System.out.println(INDENT + field.getName());
}
// Method
Method[] methods = ObjectFactory.class.getDeclaredMethods();
for (Method method : methods) {
if (method.getReturnType().equals(JAXBElement.class)) {
continue;
}
Object object = method.invoke(factory, null);
System.out.println(object.getClass().getName());
Field[] subFields = object.getClass().getDeclaredFields();
for (Field field : subFields) {
System.out.println(INDENT + field.getName());
}
}
}
}
}

