2017-03-19 5 views
3

メンバー変数を持つクラスがメンバー変数を持つ別のクラスであるとします。どちらのクラスの各変数の値を取得するには?Javaリフレクションサブクラスの変数値を取得する/メンバフィールドからオブジェクトインスタンスを取得する

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); 
} 

変数と値を取得する:

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

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())); 
      } 

     } 
    } 
} 

出力ソリューションは、かなり単純なものでした。 他の誰かが同じ問題に出くわした場合、私はそれをどのように解決したのですか?

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; 
} 
関連する問題