web-dev-qa-db-ja.com

リフレクション経由でJavaフィールドから文字列値を取得する方法は?

私には方法があります:

public void extractStringFromField(Class<?> classToInspect) {
    Field[] allFields = classToInspect.getDeclaredFields();

    for(Field field : allFields) {
        if(field.getType().isAssignableFrom(String.class)) {
            System.out.println("Field name: " + field.getName());

            // How to get the actual value of the string?!?!
            // String strValue = ???
        }
    }
}

これを実行すると、次のような出力が得られます。

Field name: Java.lang.String

では、実際の文字列値をstrValueに抽出するにはどうすればよいですか?sing reflection?

20
user1768830

クラスのインスタンスへの参照が必要なようです。 get を呼び出して参照を渡し、戻り値をStringにキャストします。

Getは次のように使用できます。

String strValue = (String) field.get (objectReference);
34
Owen

理想的な状況では、Classはデータを保持しません。インスタンスの構造と動作に関する情報を保持するだけで、Classesのインスタンスは使用するデータを保持します。したがって、extractStringFromFieldメソッドは(実際に値を抽出する場所から)インスタンスを渡さない限り、値を抽出できません。

参照のパラメーターの名前である、値を抽出するために渡すのがinstanceである場合、次のように簡単に目的のものを取得できます。

String strValue = (String)field.get(instance);
5

反射フィールドの便利なサンプルコード:

Field[] fields = InsanceName.getDeclaredFields();
for (Field field : fields) {      //array for fields names

System.out.println("Fields: " + Modifier.toString(field.getModifiers())); // modyfiers
System.out.println("Fields: " + field.getType().getName());  //type var name
System.out.println("Fields: " + field.getName());        //real var name
field.setAccessible(true);                                //var readable
System.out.println("Fields: " + field.get(InsanceName));  //get var values  
System.out.println("Fields: " + field.toString());     //get "String" values
System.out.println("");  //some space for readable code
}
1
Dmitry Knyazev