java - 获取 Java 中 `-illegal-access` 设置的当前值

标签 java reflection settings

本文,JDK 9: Proposal to allow illegal reflective access by default ,声称–permit-illegal-access选项将被更通用的选项取代,–illegal-access .

  • –illegal-access=permit
  • –illegal-access=warn
  • –illegal-access=debug
  • –illegal-access=deny

  • ➥ 发生过吗?有没有–illegal-access环境?

    ➥ 这些是怎么设置的?启动 JVM 的参数?

    ➥ 如何在运行时获取当前值?

    最佳答案

    那发生了吗?是否有 –illegal-access 设置?

    是的,这似乎确实发生了——至少对于 OpenJDK/OracleJDK。该选项在 java 的文档中列出。 “工具”。

  • JDK-9 documentation
  • JDK-10 documentation
  • JDK-11 documentation

  • 执行 java --help-extra 时也会列出。 .

    注意:JDK-11 文档提到此选项将在 future 版本中删除。

    这些是怎么设置的?启动 JVM 的参数?

    是的,它是一个命令行选项。例子:

    java --illegal-access=deny --module-path <path> --module <module>/<main-class> [args...]
    

    如何在运行时获取当前值?

    不幸的是,我不知道有什么方法可以在运行时查询值。它似乎不是系统或环境属性的一部分。我尝试找到内部使用该值的位置,但无法找到(但说实话,我没有花太多时间查看)。

    为方便起见,这里是 --illegal-access 的文档对于 JDK-11:

    --illegal-access=parameter

    When present at run time, --illegal-access= takes a keyword parameter to specify a mode of operation:

    Note:

    This option will be removed in a future release.




  • permit :此模式打开运行时镜像中每个模块中的每个包,以在所有未命名模块(例如类路径上的代码)中编码,如果该包存在于 JDK 8 中。这将启用静态访问(例如,通过编译的字节码和深度反射访问)通过平台的各种反射 API。对任何此类包的第一次反射访问操作会导致发出警告。但是,在第一次发生后不会发出警告。此单个警告描述了如何启用更多警告。此模式是当前 JDK 的默认模式,但将在 future 版本中更改。
  • warn : 此模式与 permit 相同除了为每个非法的反射访问操作发出警告消息。
  • debug : 此模式与 warn 相同除了为每个非法的反射访问操作发出警告消息和堆栈跟踪之外。
  • deny : 此模式禁用所有非法访问操作,但由其他命令行选项启用的操作除外,例如 --add-opens .此模式将成为 future 版本中的默认模式。


  • 默认模式,--illegal-access=permit , 旨在让您了解类路径上的代码,这些代码至少反射性地访问任何 JDK 内部 API 一次。要了解所有此类访问,您可以使用 warndebug模式。对于需要非法访问的类路径上的每个库或框架,您有两个选择:


  • 如果组件的维护者已经发布了不再使用 JDK 内部 API 的固定版本,那么您可以考虑升级到该版本。
  • 如果该组件仍需要修复,那么您可以联系其维护人员,并要求他们使用适当的导出 API 替换对 JDK 内部 API 的使用。


  • 如果您必须继续使用需要非法访问的组件,那么您可以使用一个或多个 --add-opens 来消除警告消息。选项以仅打开需要访问的那些内部包。

    要验证您的应用程序是否已为 JDK 的 future 版本做好准备,请使用 --illegal-access=deny 运行它。以及任何必要的 --add-opens选项。任何剩余的非法访问错误很可能是由于从编译代码到 JDK 内部 API 的静态引用。您可以通过运行 jdeps 来识别这些。带有 --jdk-internals 的工具选项。出于性能原因,当前的 JDK 不会对非法静态访问操作发出警告。

    关于java - 获取 Java 中 `-illegal-access` 设置的当前值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53790182/

    相关文章:

    C# 应用程序设置不使用自定义类保存

    java - 3.1版本如何获取EhCache的大小

    java - 切换案例错误验证

    java - 用于限制文件写入单个目录的简单 Java 安全策略是什么?

    java - MySQL - 遍历结果集中的列

    java - 如何使用Reflection类动态调用setter和getter方法?

    scala - 关于 this.type 的令人惊讶的等价和不等价

    c# - 如何将应用程序设置导出到可移植文件中? [C#]

    c# - 映射对象

    iphone - 在 iOS6 中通过 Facebook 分享 - 设置按钮不起作用