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;
}
}