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

llycmphe  于 2023-08-02  发布在  Java
关注(0)|答案(1)|浏览(116)

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

q3qa4bjr

q3qa4bjr1#

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

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

相关问题