web-dev-qa-db-ja.com

Java 9の--add-exportsと--add-opensの違いは何ですか?

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に更新されました説明する。

28
vip
  • _--add-exports_ を使用すると、パッケージがエクスポートされます。つまり、その中のすべてのパブリックタイプとメンバーは、コンパイル時および実行時にアクセスできます。
  • _--add-opens_ を使用すると、パッケージが開かれます。つまり、すべてのタイプとメンバー(パブリックなものだけでなく!)が実行時にアクセス可能になります。

したがって、実行時の主な違いは、_--add-opens_が「ディープリフレクション」、つまり非公開メンバーのアクセスを許可することです。通常、setAccessible(true)を呼び出すコードを反映することで、この種のアクセスを識別できます。

39
Nicolai