私は何かを明確にしたいと思います。Guava Reflectionを使用したプライベートフィールドへの参照
「プレーン」なJavaのリフレクション技術(ライブラリを使用しない)afaikではプライベートフィールドへの参照を取得することはできません。つまり、フィールド値はjava.lang.reflect.Field
オブジェクトです。例えば
、私はこのクラスがある場合:私はこれを実行しようとすると
public class MyClass {
private String field1;
}
を:
Field field = MyClass.class.getField("field1");
私はNoSuchFieldException
例外が発生します、予想通り。 Guava Reflection libraryで
私はこれを実行しようとした場合、:
java.lang.IllegalStateException: Unknown property: field1 in class MyClass
そして、これも期待された:
Object o = new MyClass();
Property property = Properties.getPropertyByName(o, "field1");
Field f = property.getField();
を私は次の例外を取得します。しかし、ゲッターメソッドを追加すると、次のようになります。
次に、Guava反射コードが機能しています。 私はこれについて少し損失があると告白する必要があります。リフレクションライブラリはゲッターを使ってプライベートインスタンス変数の値を返すことができますが、Fieldオブジェクト自体はゲッターが存在するだけなので、理解できますか?これはどうやって起こるのでしょうか?あなたはグアバは、ボンネットの下にやっていることはおそらくあり、標準のJavaリフレクションを使用して、プライベートフィールドに反映させることができ
私は完全にはよく分からないが、あなたは 'フィールドフィールド= MyClassのを試してみました。 class.getDeclaredField( "field1"); '?これは違いかもしれません... – user219882
はい、その唯一の問題は、getDeclaredFieldは私にクラスによって宣言されたフィールドだけを与え、祖先ではないということです。私は問題を回避する方法を見ていますが(祖先を通して反復する)、退屈な定型コードを書くのと少し似ています... – Sergio
この質問はGuavaとは関係がないので、タグを付けない "Guava" –