2

私は何かを明確にしたいと思います。

「プレーンな」Java リフレクション手法 (ライブラリを使用しない) では、プライベート フィールド (java.lang.reflect.Fieldつまり、フィールド値ではなくオブジェクト) への参照を取得することはできません。

たとえば、このクラスがある場合:

public class MyClass {
  private String field1;
}

これを実行しようとすると:

Field field = MyClass.class.getField("field1");

予想通り、NoSuchFieldException例外が発生します。

Guava Reflection ライブラリを使用して、これを実行しようとすると:

Object o = new MyClass();
Property property = Properties.getPropertyByName(o, "field1");
Field f = property.getField();

次の例外が発生します。

java.lang.IllegalStateException: Unknown property: field1 in class MyClass

そして、これも予想されていました。ただし、getter メソッドを追加すると、次のようになります。

public class MyClass {
  private String field1;
  public String getField1() {return field1;}
}

次に、グアバ反射コードが機能しています。私はこれについて少し損をしていると告白しなければなりません。リフレクション ライブラリは getter を使用してプライベート インスタンス変数の値を返すことができることを理解していますが、getter が存在するという理由だけで Field オブジェクト自体が返されますか?. 誰かがこれがどのように起こるか考えていますか?

4

2 に答える 2

4

標準の Java リフレクションを使用してプライベート フィールドをリフレクションできます。これはおそらく Guava が内部で行っていることです。

Class<?> c = ... some class ...
Field field = c.getDeclaredField("name");
field.setAccessible(true);
Object value = field.get(object);

getDeclaredFieldプライベート フィールドを取得できます。 setAccessibleセキュリティ上の問題を防ぐために必要です。

とにかく、ベスト プラクティスとして、リフレクションをパブリック メンバーのみに使用することを検討してください。そのため、可能であればゲッター/セッターを使用してください。

それが役立つことを願っています。

于 2012-04-13T23:10:47.740 に答える
1

Fieldは、メソッドsetAccessible()を持つAccesibleObjectを拡張し、プライベート フィールドの値にアクセスできるようにします。

Guava-Reflection (このライブラリは Guava とは異なることに注意してください) は、Property.getFieldValue() などのメソッドでプライベート フィールドにアクセスできるようにします。

于 2012-04-13T23:15:18.860 に答える