Java 9(jdk-9 + 170)では、新しいモジュールシステムにより、以前のバージョンのJavaとは異なり、デフォルトではアプリケーションはJDKのすべてのクラスを見ることができません。
これを回避するために、Java
コマンドラインに新しい引数--add-exports
これにより、次のようにカプセル化を解除できます。
Java -jar josm.jar --add-exports Java.base/Sun.security.util=ALL-UNNAMED --add-exports Java.base/Sun.security.x509=ALL-UNNAMED
これは JEP 261 で説明されています。
同様のオプションについて読んだ--add-opens
同じ構文を使用していますが、JEP 261はまだ説明されていません(最終更新:2017/03/08 13:58)。
これら2つのオプションの違いは何ですか?
[〜#〜] edit [〜#〜]: JEP 261 は2017-09-22に更新されました説明する。
--add-exports
_ を使用すると、パッケージがエクスポートされます。つまり、その中のすべてのパブリックタイプとメンバーは、コンパイル時および実行時にアクセスできます。--add-opens
_ を使用すると、パッケージが開かれます。つまり、すべてのタイプとメンバー(パブリックなものだけでなく!)が実行時にアクセス可能になります。したがって、実行時の主な違いは、_--add-opens
_が「ディープリフレクション」、つまり非公開メンバーのアクセスを許可することです。通常、setAccessible(true)
を呼び出すコードを反映することで、この種のアクセスを識別できます。