122

クラスのフィールドの値を動的に設定するために、いくつかの注釈を使用しています。public、protected、private のいずれであってもこれを実行したいのでsetAccessible(true)、メソッドを呼び出す前に毎回 Field オブジェクトを呼び出していset()ます。setAccessible()私の質問は、コールがフィールド自体にどのような影響を与えるかです。

より具体的には、それがプライベート フィールドであり、この一連のコードが を呼び出すとしますsetAccessible(true)。コード内の別の場所でリフレクションを介して同じフィールドを取得する場合、そのフィールドは既にアクセス可能でしょうか? または、 メソッドgetDeclaredFields()getDeclaredField()メソッドは毎回 Field オブジェクトの新しいインスタンスを返しますか?

質問を述べる別の方法は、 を呼び出した場合setAccessible(true)、完了後に元の値に戻すことがどれほど重要かということだと思います。

4

4 に答える 4

105

setAccessible()の動作AccessibleObject、つまりインスタンスを変更しFieldますが、クラスの実際のフィールドは変更しません。ドキュメントは次のとおりです(抜粋):

の値はtrue、反映されたオブジェクトが使用時に Java 言語アクセス制御のチェックを抑制する必要があることを示します。

そして実行可能な例:

public class FieldAccessible {
    public static class MyClass {
        private String theField;
    }

    public static void main(String[] args) throws Exception {
        MyClass myClass = new MyClass();
        Field field1 = myClass.getClass().getDeclaredField("theField");
        field1.setAccessible(true);
        System.out.println(field1.get(myClass)); // no exception
        Field field2 = myClass.getClass().getDeclaredField("theField");
        System.out.println(field2.get(myClass)); // IllegalAccessException
    }

}
于 2012-05-17T15:43:27.263 に答える
37

このオブジェクトには変更可能なフラグgetDeclaredFieldがあるため、メソッドは毎回新しいオブジェクトを返す必要があります。accessibleしたがって、フラグをリセットする必要はありません。詳細については、このブログ投稿を参照してください。

于 2012-05-17T15:41:09.893 に答える
-1
import java.lang.reflect.Field;
import java.lang.reflect.Method;

public class PrivateVariableAcc {

    public static void main(String[] args) throws Exception {
        PrivateVarTest myClass = new PrivateVarTest();
        Field field1 = myClass.getClass().getDeclaredField("a");
        field1.setAccessible(true);
        System.out.println("This is access the private field-"
            + field1.get(myClass));
        Method mm = myClass.getClass().getDeclaredMethod("getA");
        mm.setAccessible(true);
        System.out.println("This is calling the private method-"
            + mm.invoke(myClass, null));
    }

}
于 2013-11-23T09:45:52.903 に答える