假设我有一个类,它有一些成员变量,一个或多个是另一个也有成员变量的类。如何获取两个类中每个变量的值?
我可以通过调用获取变量: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<String, Object> getMemberFields(Object obj) throws IllegalAccessException,
NoSuchFieldException
{
HashMap<String, Object> fieldValues = new HashMap<String, Object>();
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;
}
关于Java反射获取子类变量值/从成员字段获取对象实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42882023/