[解決済み] 不正な反射型アクセスとは?
質問事項
Java 9 の不正な反射アクセスに関する質問が多くあります。
エラーメッセージを回避する方法については多くの議論がありますが、不正な反射アクセスとは実際にどのようなものなのかを知りたいです。
そこで質問なのですが
不正な反射アクセスの定義と、どのような状況で警告が発生するのでしょうか?
Java 9で導入されたカプセル化の原則と関係があることはわかりましたが、それがどのように組み合わされ、何が警告の引き金となり、どのようなシナリオになるのかについての説明が見当たりません。
解決方法は?
モジュールとそれぞれのパッケージ間のアクセスについて理解することは別として。私は、この問題の核心は モジュールシステム#Relaxed-strong-encapsulation そして、その中から関連する部分を抜き出して、質問に答えようとするのです。
<ブロッククオート不正な反射的アクセスの定義と、どのような状況か 警告が出るきっかけは?
Java-9への移行を支援するために、モジュールの強力なカプセル化を緩和することができる。
-
実装は 静的アクセス つまり、コンパイルされたバイトコードによるものです。
-
のコードにオープンなモジュールの1つまたは複数のパッケージで、そのランタイムシステムを呼び出す手段を提供してもよい。 すべての無名モジュール つまり、クラスパス上のコードに対してです。ランタイムシステムがこの方法で呼び出され、 そうすることによって、そうでなければ失敗したであろうところで、 リフレクションAPIのいくつかの呼び出しが成功するならば、です。
そのような場合、実は、あなたが作ってしまった リフレクティブアクセス という "違法"。 純粋なモジュールの世界では、このようなアクセスは想定されていなかったからです。
どのような仕組みで、どのような場合に警告が発生するのでしょうか。 シナリオは?
このカプセル化の緩和は、新しいランチャーオプションによって実行時に制御されます。
--illegal-access
と同じで、Java9ではデフォルトで
permit
. そのため
permit
モードは
このようなパッケージに対する最初の反射アクセス操作によって という警告が出ますが、それ以降、警告は出ません。 この1つの警告は、それ以降の警告を有効にする方法を説明しています。この 警告を抑制することはできません。
モードは値で設定可能です
debug
(メッセージと、そのようなアクセスごとのスタックトレース)。
warn
(そのようなアクセスごとのメッセージ)、および
deny
(そのような操作を無効化する)。
アプリケーションのデバッグと修正のためのいくつかの事柄は、以下の通りです。
-
で実行します。
--illegal-access=deny
について知り、回避するために オープン を含むモジュール宣言なしに、あるモジュールから別のモジュールへパッケージを移動させることができます (opens
を明示的に使用するか--add-opens
VM arg. -
コンパイルされたコードから JDK 内部 API への静的な参照は
jdeps
ツールを使って--jdk-internals
オプション
<ブロッククオート不正な反射アクセス操作が行われた場合に表示される警告メッセージ が検出された場合、以下のような形式になります。
WARNING: Illegal reflective access by $PERPETRATOR to $VICTIM
のところです。
$PERPETRATOR
を含む型の完全修飾名です。
当該反射的操作を呼び出したコードと、そのコード
ソース(つまり、JARファイルのパス)がある場合は、そのソースと
$VICTIM
は、アクセスされるメンバーを説明する文字列です。
囲んでいる型の完全修飾名を含む
このような警告例に対する質問: = JDK9: 不正な反射的アクセス操作が発生しました org.python.core.PySystemState
最後に重要なことですが、このような警告に直面しないように、また将来的に安全であるようにするために必要なことは、あなたのモジュールが違法な反射アクセスをしていないことを確認することです :)
関連
-
[解決済み] java.sql.SQLException: ユーザー 'root'@'localhost' (using password: YES) のためのアクセスが拒否されました。
-
[解決済み】メソッド本体がない、またはJavaで抽象的な宣言をする
-
[解決済み] org.springframework.cglib.core.ReflectUtils$1 による不正な反射的アクセス
-
[解決済み] JavaにおけるHashMapとHashtableの違いは何ですか?
-
[解決済み] Javaにおけるpublic、protected、package-private、privateの違いは何ですか?
-
[解決済み] serialVersionUIDとは何ですか、またなぜそれを使用する必要がありますか?
-
[解決済み] リフレクションとは何か、なぜ有用なのか?
-
[解決済み] JavaBeanとは何ですか?
-
[解決済み] Could not find or load main class "とはどういう意味ですか?
-
[解決済み】Apache Camelとは一体何ですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] java.sql.SQLException: ユーザー 'root'@'localhost' (using password: YES) のためのアクセスが拒否されました。
-
[解決済み】「'void' type not allowed here」エラーの原因とは?
-
[解決済み] 二項演算子「&」のオペランド型がおかしい java
-
[解決済み】HTTPステータス500 サーブレットクラスのインスタンス化エラー [重複]。
-
[解決済み】非閉鎖文字リテラルエラー
-
[解決済み】Eclipseがエラーメッセージ "Java was started but returned exit code = 1" を返す
-
[解決済み】java.io.IOException: 壊れたパイプ
-
[解決済み】Javaで文字列をコピーするにはどうしたらいいですか?
-
[解決済み] Hide Utility Class Constructor : ユーティリティクラスはパブリックまたはデフォルトコンストラクタを持つべきではありません。
-
[解決済み] java.sql.SQLException を取得しました。ResultSet が終了した後の操作は許可されません。