由于新的模块系统,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-09-22更新以解释它。
--add-exports
可以导出包,这意味着其中的所有公共类型和成员都可以在编译和运行时访问。--add-opens
打开包,这意味着其中的所有类型和成员(不仅是公共类型!)都可以在运行时访问。因此运行时的主要区别在于
--add-opens
允许“深度反射”,这意味着非公共成员的访问。您通常可以通过调用 setAccessible(true)
的反射代码来识别这种访问。