ホームページ > Java > &#&チュートリアル > Java 9 の InaccessibleObjectException: リフレクションとモジュール システムの競合を解決する方法は?

Java 9 の InaccessibleObjectException: リフレクションとモジュール システムの競合を解決する方法は?

Susan Sarandon
リリース: 2025-01-05 07:13:40
オリジナル
123 人が閲覧しました

How to Solve Java 9's InaccessibleObjectException:  Reflection and Module System Conflicts?

Java 9 での InaccessibleObjectException への対処: メンバーをアクセス可能にできない

Java プラットフォーム モジュール システムの厳密なカプセル化が原因で Java 9 で InaccessibleObjectException が発生する、公開可視性やパッケージなどの特定の条件下でのみアクセスを許可します。

原因とシナリオ

この例外は通常、次の場合に発生します。

  • ライブラリまたはフレームワークがリフレクションを使用して JDK モジュール要素にアクセスする (ケース) 1) などjava.lang.ClassLoader.defineClass().
  • リフレクションベースのライブラリ/フレームワーク (Spring など) がアプリケーション コードの Bean またはエンティティにアクセスする (ケース 2)。

解決ケース 1: 反射的な呼び出しJDK

JDK モジュールは不変であるため、解決策はリフレクション用にパッケージを開くコマンドライン フラグにあります。たとえば、例外を解決するには:

java --add-opens java.base/java.lang=ALL-UNNAMED
ログイン後にコピー

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

リフレクション コードが編集可能なモジュール内にある場合は、そのコードを強化することを検討してください。モジュール記述子:

  • エクスポート:パッケージを公開して、コンパイル時および実行時にすべてのコードで使用できるようにします。
  • exports ... to: アクセスするモジュールにパッケージを具体的に公開します。
  • opens: すべてのパッケージへのランタイム アクセスを (リフレクションの有無にかかわらず) 許可します。 code.
  • opens ... to: 特定のモジュールのパッケージへのランタイム アクセス (リフレクションの有無にかかわらず) を許可します。
  • open module: すべてのモジュールへの実行時アクセス (リフレクションの有無にかかわらず) のためにモジュール全体を開きますcode.

その他の解決策

Java 9 のみで、次のコマンドを使用してカプセル化保護を無効にできます。

java --permit-illegal-access
ログイン後にコピー

注: セキュリティへの影響のため、このフラグは慎重に使用する必要があります。モジュール構成とベスト プラクティスの詳細については、リンクされたリソースを参照してください。

以上がJava 9 の InaccessibleObjectException: リフレクションとモジュール システムの競合を解決する方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート