Java 9 中的 --add-exports 和 --add-opens 有什么区别?
What's the difference between --add-exports and --add-opens in Java 9?
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 更新以进行解释。
- 使用
--add-exports
包被导出,这意味着其中的所有 public 类型和成员都可以在编译和 运行 时访问。
- 随着
--add-opens
包被打开,这意味着其中的所有类型和成员(不仅是 public 个!)在 运行 时间可以访问。
因此 运行 时间的主要区别是 --add-opens
允许 "deep reflection",这意味着非 public 成员的访问。您通常可以通过调用 setAccessible(true)
.
的反射代码来识别这种访问
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 更新以进行解释。
- 使用
--add-exports
包被导出,这意味着其中的所有 public 类型和成员都可以在编译和 运行 时访问。 - 随着
--add-opens
包被打开,这意味着其中的所有类型和成员(不仅是 public 个!)在 运行 时间可以访问。
因此 运行 时间的主要区别是 --add-opens
允许 "deep reflection",这意味着非 public 成员的访问。您通常可以通过调用 setAccessible(true)
.