Java 遍历泛型类

Java 遍历泛型类,java,android,reflection,iteration,Java,Android,Reflection,Iteration,是否可以打印出类中每个字段的名称和类型?现在我有以下代码 try { for (Field field : obj.getClass().getDeclaredFields()) { System.out.println("User Preferences " + field.getName() + " - " + field.getType()); } }catch (IllegalArgumentException e) {

是否可以打印出类中每个字段的名称和类型?现在我有以下代码

try {
   for (Field field : obj.getClass().getDeclaredFields()) {
   System.out.println("User Preferences " + field.getName()
                     + " - " + field.getType());
   }
}catch (IllegalArgumentException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
}
其中显示:

User Preferences customer - class java.lang.String
User Preferences token - class java.lang.String
User Preferences class1 - class com.activity.webservice.Login$Class1
这就是我想要的(几乎)

问题是让它进入定制类Class1。Class1类可以有多个类,也可以没有类。Class1类可以有多个字段,也可以没有字段

我想把这样的东西打印出来

User Preferences customer - class java.lang.String
User Preferences token - class java.lang.String
User Preferences class1 - class com.activity.webservice.Login$Class1
User Preferences string1 - class java.lang.String
User Preferences class2 - class com.activity.webservice.Login$Class2
User Preferences string2 - class java.lang.String
User Preferences string3 - class java.lang.String
如何迭代未知数量的字段和类

谢谢你的帮助

编辑

下面是我的登录类的结构

public class Login {

     public String token;   
     public String customerid;
     public Class1 class1;

     public class Class1 {
            public Class2 class2;
            public String string1;

            public class Class2 {
                    public int int1;
                    public String string2;
                    public String string3;
            }
     }
}

下面是如何递归地执行此操作的总体思路。只需传入需要字段的类,它也应该递归地检查所有子类的字段

// Call this method to get the list of fields.
public static List<String> getAllFields(Class<?> clazz) {
    List<String> results = new ArrayList<String>();
    getFieldDescsForClass(clazz, results);
    return results;
}

private static void getFieldDescsForClass(Class<?> clazz, List<String> outList) {
    // Loop over all the fields and add the info for each field
    for (Field field : clazz.getDeclaredFields()) {
        // Ignore synthetic fields
        if (!field.isSynthetic()) {
            outList.add(String.format("User Preferences %s - %s", field.getName(), field.getType()));
        }
    }

    // For any internal classes, recursively call this method and add the results
    // (which will in turn do this for all of that subclass's subclasses)
    for (Class subclazz : clazz.getDeclaredClasses()) {
        getFieldDescsForClass(subclazz, outList);
    }
}
//调用此方法以获取字段列表。
公共静态列表getAllFields(类clazz){
列表结果=新建ArrayList();
GetFieldDescrsforClass(课堂、结果);
返回结果;
}
私有静态void getFieldDescsForClass(类clazz,列表大纲){
//循环所有字段并为每个字段添加信息
for(字段:clazz.getDeclaredFields()){
//忽略合成场
如果(!field.isSynthetic()){
添加(String.format(“用户首选项%s-%s”、field.getName()、field.getType());
}
}
//对于任何内部类,递归调用此方法并添加结果
//(这将反过来对该子类的所有子类执行此操作)
对于(类子类:clazz.getDeclaredClasses()){
getFieldDescsForClass(子类,大纲视图);
}
}
}

测试了它

class Login {

public String token;   
public String customerid;
public Class1 class1;

public class Class1 {
       public Class2 class2;
       public String string1;

       public class Class2 {
               public int int1;
               public String string2;
               public String string3;
       }
}
}

输出:

类java.lang.String

类java.lang.String

类登录名$Class1

类登录名$Class1$Class2

类java.lang.String

类登录

int

类java.lang.String

类java.lang.String


类登录名$Class1

什么数据结构保存此信息?@m0skit0这将是它自己的类中的一个方法。无论传入什么对象,我都可以使用递归方法获得所需的信息—每个级别都进入成员class@Bhaskar我如何传入新类进行迭代?我会使obj=Class1,然后再次调用我的方法吗。当我看不到另一个类时停止该方法?您可以将成员字段的类传递到递归调用中,并在当前类标记中没有字段(即它是一个基本类)时停止。(或者提出你自己关于何时停止向下搜索的自定义逻辑)我不确定你的意思。哎呀,我只是误解了这个问题。对不起@kcoppock检查我上面所做的编辑。此方法进入Class1,但返回一个随机长变量。这种方法适用于我的结构吗?随机长?你的类可以序列化吗?它可能会返回序列ID。这肯定适用于您的类结构;你没有看到它递归地工作吗?这些是对外部类的隐式引用(因为内部类是非静态的)。在添加到列表之前,可以通过选中
field.isSynthetic()
来避免捕获这些内容。如果
isSynthetic()
为true,则它是隐式添加的字段。
class Login {

public String token;   
public String customerid;
public Class1 class1;

public class Class1 {
       public Class2 class2;
       public String string1;

       public class Class2 {
               public int int1;
               public String string2;
               public String string3;
       }
}