ここで述べたように:
「アクセシビリティは、コンパイル時に決定できる静的プロパティです。タイプと宣言修飾子にのみ依存します。」
この場合、関数は実行時java.lang.reflect.Field.setAccessible(boolean)
に実際に何をしますか?
setAccessible
メンバーのアクセシビリティレベルは変更されません。これは、特定のメンバーがリフレクションのみを介してアクセスできるようにするだけです。コードは実際にはメンバーにアクセスしないため、これはアクセシビリティのルールを明示的に破ることはありません。内部で何らかの魔法を実行するReflectionメソッドを呼び出し、ユーザーに代わってメンバーにアクセスします。
これを念頭に置いて、注意すべき重要な点もあります。Javaには、外部コードへのリフレクションの使用を拒否できる非常に強力で侵入不可能なセキュリティシステムもあります。必要なときはいつでも、このメカニズムを使用して、プライベートメンバーへのアクセスを真に防ぐことができます。
期待どおりに、リフレクションを使用してオブジェクトのアクセシビリティを変更できます。クラスのjavadocAccessibleObject
から:
リフレクトされたオブジェクトにアクセス可能なフラグを設定すると、Java Object Serializationやその他の永続化メカニズムなど、十分な権限を持つ高度なアプリケーションが、通常は禁止されている方法でオブジェクトを操作できるようになります。
あなたの見積もりはリフレクションAPIには適用されません。JLS#1.4は、JLSによって明示的に許可されていないリフレクション操作を介して達成できることを明示的に述べています。
したがって、この仕様では反射について詳しく説明していません。多くの言語構造には、リフレクションAPIに類似したものがありますが、これらについては通常、ここでは説明しません。したがって、たとえば、オブジェクトを作成できる方法をリストする場合、通常、リフレクティブAPIがこれを実現できる方法は含まれていません。このテキストでは言及されていませんが、読者はこれらの追加のメカニズムに注意する必要があります。