私には方法があります:
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?
クラスのインスタンスへの参照が必要なようです。 get を呼び出して参照を渡し、戻り値をStringにキャストします。
Getは次のように使用できます。
String strValue = (String) field.get (objectReference);
理想的な状況では、Class
はデータを保持しません。インスタンスの構造と動作に関する情報を保持するだけで、Classes
のインスタンスは使用するデータを保持します。したがって、extractStringFromField
メソッドは(実際に値を抽出する場所から)インスタンスを渡さない限り、値を抽出できません。
参照のパラメーターの名前である、値を抽出するために渡すのがinstance
である場合、次のように簡単に目的のものを取得できます。
String strValue = (String)field.get(instance);
反射フィールドの便利なサンプルコード:
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
}