Java 9 中的 --add-exports 和 --add-opens 有什么区别?

问题描述 投票:0回答:1

由于新的模块系统,Java 9 (jdk-9+170) 默认情况下不允许应用程序查看 JDK 中的所有类,这与所有以前版本的 Java 不同。

为了解决这个问题,

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更新以解释它。

java command-line-arguments java-9 java-platform-module-system java-module
1个回答
186
投票
  • 使用
    --add-exports
    可以导出包,这意味着其中的所有公共类型和成员都可以在编译和运行时访问。
  • 使用
    --add-opens
    打开包,这意味着其中的所有类型和成员(不仅是公共类型!)都可以在运行时访问。

因此运行时的主要区别在于

--add-opens
允许“深度反射”,这意味着非公共成员的访问。您通常可以通过调用
setAccessible(true)
的反射代码来识别这种访问。

© www.soinside.com 2019 - 2024. All rights reserved.