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

标签 java command-line-arguments java-9 java-platform-module-system 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/03/08 13: 58).

这两个选项有什么区别?

编辑:JEP 261已于2017-09-22更新说明。

最佳答案

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

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

关于java - Java 9 中的 --add-exports 和 --add-opens 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44056405/

相关文章:

java - jax-ws 将 Content-type 更改为 Content-Type 因为服务器非常敏感

c - 命令行参数如何工作?

bash - 大量参数(操作数)在命令行参数传递中排在首位

java.io.File.<init>(File,String) JDK 版本依赖

java - 在 JShell 上执行时同一语句的不同行为

java - 有没有Java API来捕获请求和响应SOAP信封?

java - 如何在 Maven 中将测试用例作为单独的 Java 进程运行

java - 使用 jpype 获取 jar 文件中的单例对象

c# - 在 C# 中处理命令行选项的最佳方式

jvm - 如何列出-Xlog的语法和可用标签