ホームページ >Java >&#&チュートリアル >Java 9 における不正なリフレクティブ アクセスとは何ですか?また、それはどのように発生しますか?

Java 9 における不正なリフレクティブ アクセスとは何ですか?また、それはどのように発生しますか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-12-05 15:12:10299ブラウズ

What is Illegal Reflective Access in Java 9 and How Does It Manifest?

不正なリフレクティブ アクセス

Java 9 では、不正なリフレクティブ アクセスとは、強化されたカプセル化原則に違反する方法でリフレクティブ API が使用される状況を指します。モジュールシステムによって導入されました。これは、あるモジュールのコードが適切な承認なしに別のモジュールのクラスのプライベート メンバーまたは保護されたメンバーにアクセスしようとした場合に発生する可能性があります。

不正なリフレクティブ アクセスの定義

不正なリフレクティブ アクセス

  • のプライベートまたは保護されたメンバーにアクセスする任意のリフレクション操作として定義されます。別のモジュールのクラス
  • 別のモジュールのクラスのプライベート メソッドを呼び出します
  • 別のモジュールのクラスの最終フィールドを変更します
  • 次のクラスのインスタンスを作成します別のモジュールでは公開されていません

トリガー状況

不正なリフレクティブ アクセスは、次の場合にトリガーされます。

  • あるモジュールのクラスがリフレクションを使用して、明示的にアクセスされていない別のモジュールのクラスのプライベート メンバーまたは保護されたメンバーにアクセスします。モジュール宣言または VM 引数を通じて最初のモジュールに公開されます。
  • 1 つのモジュール内のクラスは、リフレクションを使用して、モジュールのプライベート メソッドを呼び出します。最初のモジュールに明示的に公開されていない別のモジュールのクラス。
  • あるモジュールのクラスはリフレクションを使用して、最初のモジュールに明示的に公開されていない別のモジュールのクラスの最終フィールドを変更します。
  • あるモジュール内のクラスはリフレクションを使用して、別のモジュールでは公開されていないクラスのインスタンスを作成します。 module.

モジュール システムと緩和されたカプセル化

Java 9 では、特定の限定された形式のリフレクティブ アクセスを許可する緩和された強いカプセル化ルールが導入されました。具体的には、モジュールのランタイム システムがモジュール内のパッケージを開いて、名前のないモジュール (つまり、クラスパス上のコード) をコード化できるようにします。このオプションを使用してランタイム システムが呼び出され、通常は失敗するはずのリフレクションの使用に成功した場合、「不正な」リフレクション アクセスが発生したことになります。

警告メッセージ

不正な反射アクセスが発生すると、次の形式で警告メッセージが発行されます:

WARNING: $PERPETRATOR による $VICTIM

への不正なリフレクション アクセス:

  • $PERPETRATOR は、リフレクション操作を呼び出したコードとコード ソースを含む型の完全修飾名です。 (JAR ファイル パス) (利用可能な場合)。
  • $VICTIM は、アクセスされるメンバーを記述します。囲んでいる型の完全修飾名。

以上がJava 9 における不正なリフレクティブ アクセスとは何ですか?また、それはどのように発生しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。