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更新,以解释它。
答案 0 :(得分:38)
--add-exports
导出包,这意味着可以在编译和运行时访问其中的所有公共类型和成员。--add-opens
打开包,这意味着其中的所有类型和成员(不仅是公共的!)都可以在运行时访问。因此,运行时的主要区别在于--add-opens
允许“深度反思”,这意味着非公共成员的访问。您通常可以通过反映代码来识别此类访问权限,从而调用setAccessible(true)
。