Javareflection从成员字段获取子类变量值/获取对象实例

假设我有一个具有一些成员变量的类,一个或多个是另一个也带有成员变量的类。 如何在两个类中获取每个变量的值?

我可以通过调用getDeclaredFields();来获取变量getDeclaredFields(); 并通过调用field.get(obj) Foo对象的值,然后再次迭代它们以获取子类变量。

但是如何在没有该类实例的情况下获取每个子类成员变量的值? 我的简单示例有效,因为Bar类的每个实例的变量都相同,我可以调用innerField.get(new Bar())

我想如果我能以某种方式从字段中获取对象的实例,它可以工作吗?

提前致谢

第一个对象:

 public class Foo { public Foo(){} private Integer someInt = 123; private Long someLong = 987654321L; private String someString = "qwertyuiop"; private Bar bar = new Bar(); } 

第二个对象:

 public class Bar { public Bar(){} private Double someDouble = 123.456; private String innerString = "another String"; } 

主/调用方法:

 public static void main(String[] args) throws Exception { Foo foo = new Foo(); getMemberFields(foo); } 

获取变量和值:

 public static void getMemberFields(Object obj) throws IllegalAccessException, NoSuchFieldException { Class objClass = obj.getClass(); System.out.println("obj: " + obj.getClass()); Field[] fields = objClass.getDeclaredFields(); for(Field field : fields) { field.setAccessible(true); System.out.println("Field: " + field.getName() + " value: " + field.get(obj)); Field[] innerFields = {}; if (!field.getType().getName().contains("java.lang")) { innerFields = field.getType().getDeclaredFields(); } for (Field innerField: innerFields) { if (!innerField.getName().contains("java.lang")) { Object subObj = field.getType(); innerField.setAccessible(true); System.out.println(""); System.out.println("Sub Field: " + innerField.getName()); System.out.println( "Sub Field value: " + innerField.get(new Bar())); } } } } 

产量

 obj: class Foo Field: someInt value: 123 Field: someLong value: 987654321 Field: someString value: qwertyuiop Field: bar value: Bar@61bbe9ba Sub Field: someDouble Sub Field value: 123.456 Sub Field: innerString Sub Field value: another String 

解决方案相当简单。 如果其他人遇到同样的问题,我就是这样解决的。

 private static HashMap getMemberFields(Object obj) throws IllegalAccessException, NoSuchFieldException { HashMap fieldValues = new HashMap(); Class objClass = obj.getClass(); Field[] fields = objClass.getDeclaredFields(); for(Field field : fields) { field.setAccessible(true); fieldValues.put(field.getName(), field.get(obj)); if (!field.getType().isPrimitive() && !field.getType().getName().contains("java.lang")) { getMemberFields(field.get(obj)); } } return fieldValues; }