2017-03-19 40 views
3

說我有一個類,有一個或多個成員變量是另一個類也與成員變量。我怎樣才能得到兩個類中的每個變量的值?Java反射得到子類變量值/從成員字段獲取對象實例

我可以通過調用getDeclaredFields();來獲得變量,然後通過調用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 Foo 
Field: someInt value: 123 
Field: someLong value: 987654321 
Field: someString value: qwertyuiop 
Field: bar value: [email protected] 
Sub Field: someDouble 
Sub Field value: 123.456 
Sub Field: innerString 
Sub Field value: another String 

回答

2

的解決方案是相當簡單的。 如果有其他人來解決這個問題,我就是這樣解決的。

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; 
} 
相關問題