67

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

4

1 回答 1

94
  • 随着--add-exports包被导出,这意味着其中的所有公共类型和成员都可以在编译和运行时访问。
  • 打开包后,这--add-opens意味着其中的所有类型和成员(不仅是公共的!)都可以在运行时访问。

因此,运行时的主要区别在于--add-opens允许“深度反射”,即非公共成员的访问。您通常可以通过调用setAccessible(true).

于 2017-05-18T23:40:57.517 回答