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

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 中得到了很好的解释。

我已经阅读了使用相同语法的类似选项,但JEP 261尚未更新以描述它(最后更新:2017/03/08 13:58)。--add-opens

这两个选项之间有什么区别?

编辑JEP 261已于2017-09-22更新以解释它。


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

因此,运行时的主要区别在于允许“深度反射”,即非公共成员的访问。通常可以通过调用 的反射代码来标识这种访问。--add-openssetAccessible(true)


答案 2