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

时间:2017-05-18 19:33:34

标签: java command-line-arguments java-9 jigsaw 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年3月8日13:58)。

这两个选项有什么区别?

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

1 个答案:

答案 0 :(得分:38)

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

因此,运行时的主要区别在于--add-opens允许“深度反思”,这意味着非公共成员的访问。您通常可以通过反映代码来识别此类访问权限,从而调用setAccessible(true)