簡體   English   中英

Java反射從成員字段獲取子類變量值/獲取對象實例

[英]Java reflection get sub class variable values / get object instance from member field

假設我有一個具有一些成員變量的類,一個或多個是具有成員變量的另一個類。 如何在兩個類中獲取每個變量的值?

我可以通過調用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<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;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM