ホームページ >Java >&#&チュートリアル >Java 9 の InaccessibleObjectException:「{member} をアクセス可能にできません」を解決するにはどうすればよいですか?

Java 9 の InaccessibleObjectException:「{member} をアクセス可能にできません」を解決するにはどうすればよいですか?

DDD
DDDオリジナル
2024-12-26 05:03:13604ブラウズ

How Can I Resolve Java 9's InaccessibleObjectException:

Java 9 での InaccessibleObjectException への取り組み: 「{member} をアクセス可能にできません: モジュール {A} は {B} に対して「{package} を開きません」

Java 9 では、プラットフォーム モジュール システムの導入により、より厳密なカプセル化が行われました。このカプセル化された世界では、特に Spring、Hibernate、JAXB などのライブラリのコンテキストで、恐ろしい InaccessibleObjectException がスローされることがあります。

例外の背後にある原因: この例外は、特定のメンバー (メソッド/フィールド/クラス) は、モジュール システムの制限によりアクセスが制限されています。これらの制限では通常、メンバーがパブリックであるか、そのパッケージがエクスポートされる必要があります。リフレクションは、これらのアクセス制御をバイパスしようとするため、別の課題の層を追加します。

例外への対処: 例外を回避するには、モジュール システムが制限された要素へのアクセスを許可することを確認する必要があります。 。さまざまなシナリオでこれにアプローチする方法は次のとおりです。

シナリオ 1: JDK へのリフレクティブ呼び出し

ライブラリ/フレームワークがリフレクションを介して JDK モジュールを呼び出すときに例外が発生します。ここでは、JDK モジュールを変更できないため、コマンド ライン フラグが機能します。

  • 解決策:

    • 「--add-opens」フラグを使用して、 JDK 内の特定のパッケージへのリフレクション アクセスを明示的に許可します。 module.
  • 例:

    • 「...ClassLoader.defineClass をアクセス可能にできません...」に対処する
    • java --add-opens を使用して JVM を実行します。 java.base/java.lang=ALL-UNNAMED

シナリオ 2: アプリケーション コードのリフレクション

この場合、リフレクションあるモジュール内で別のモジュールにアクセスするために使用されます。開発者は、ここでアクセスされるモジュールをより詳細に制御できます。

  • 解決策:

    • アクセスされたモジュールのモジュール記述子を変更します ( {A}) から:

      • パッケージをすべてのモジュールにエクスポートします:exports {package};
      • アクセスしているモジュールに限定してパッケージをエクスポートします:exports {package} to {B};
      • パッケージをすべてのモジュールに開きます: opens {package};
      • アクセスしているモジュールのパッケージを開きます: opens {package} to {B};
      • モジュール全体を開きます: open module {A} { ... };

以上がJava 9 の InaccessibleObjectException:「{member} をアクセス可能にできません」を解決するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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