2017-05-18 105 views
14

由於新模塊系統的原因,Java 9(jdk-9 + 170)默認情況下不允許應用程序查看來自JDK的所有類,而不像以前的所有Java版本。Java 9中--add-exports和--add-opens有什麼區別?

要解決這一點,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)。

這兩個選項有什麼區別?

編輯JEP 261已於2017-09-22更新以解釋它。

回答

20
  • 使用--add-exports包被導出,意味着所有的公共類型和成員都可以在編譯和運行時訪問。
  • 隨着--add-opens打開包,這意味着其中的所有類型和成員(不僅是公共的!)在運行時可以訪問。

所以在運行時的主要區別是--add-opens允許「深度反射」,意思是非公共成員的訪問。您通常可以通過撥打setAccessible(true)的反射代碼來識別此類訪問。

+2

值得補充的是,在運行時'-add-opens'涉及'-add-exports' – ZhekaKozlov

+2

這兩個項目符號描述了可由'--add-opens'訪問的類型/成員是'加入 - 出口「,所以我不認爲說一個牽連對方增加了任何價值的描述。 – Nicolai

+0

馬克今天更新了頁面,現在在JEP 261中對此進行了解釋:http://openjdk.java.net/jeps/261 – vip