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

vip*_*vip 29 java command-line-arguments java-platform-module-system java-9 java-module

由于新的模块系统,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更新以解释它.

Nic*_*lai 40

  • 随着--add-exports包装出口,这意味着所有的公共类型和成员在其中在编译和运行时访问.
  • 随着--add-opens包装被打开,这意味着所有类型和成员(不仅是公立!)其中是在运行时使用.

因此,运行时的主要区别在于--add-opens允许"深度反思",即非公共成员的访问.您通常可以通过调用的反映代码来识别此类访问setAccessible(true).

  • 值得补充的是,在运行时`-add-opens`意味着`-add-exports` (5认同)
  • 这两个子弹描述了`--add-opens`可以访问的类型/成员是`--add-exports`的超集,所以我不认为一个暗示另一个暗示另一个为描述添加任何值. (2认同)
  • 用于查找哪个模块提供哪个包的命令:`java --list-modules | tr@“”| awk '{ 打印 $1 }' | xargs -n1 java -d` 模块的名称将显示带@,而包的名称不带@ (2认同)