Java反射获取子类变量值/从成员字段获取对象实例
说我有一个具有一些成员变量的类,一个或多个是具有成员变量的另一个类。如何获得两个类中每个变量的值?
我可以通过以下方式获取变量:通过调用getDeclaredFields();Foo对象的值,field.get(obj)然后再次对其进行迭代以获取子类变量。
但是,如何在没有该类实例的情况下获取每个子类成员变量的值?我的平凡示例之所以有用,是因为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 FooField: 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反射获取子类变量值/从成员字段获取对象实例 的全部内容, 来源链接: utcz.com/qa/413822.html







