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

标签 java reflection

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

我可以通过调用获取变量: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/

相关文章:

java - 是否可以更改 JSESSIONID session cookie 值的长度?

java - Jawr 不能包含单个 CSS 文件

c# - 检查是否为任何属性分配了值

go - panic : reflect: call of reflect. Value.FieldByName 接口(interface)值

c# - 使用反射,我如何检测具有 setter 的属性?

java - 使用 JPA 和自动生成的主键在数据库中创建条目

java - 使用 Gosper's Hack(银行家序列)生成所有子集

java - 使用 Zeller 的方法和 Java 的星期几

java - 想要从类中存在的所有方法获取返回类型和参数类型

java - 找出使用了给定 API 的哪些类