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

Bas*_*que 15 java reflection settings

本文JDK 9: Proposal to allow非法反射访问默认情况下,声称该–permit-illegal-access选项将被更通用的选项–illegal-access.

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

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

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

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

Sla*_*law 15

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

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

它也在执行时列出java --help-extra

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


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

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

java --illegal-access=deny --module-path <path> --module <module>/<main-class> [args...]
Run Code Online (Sandbox Code Playgroud)

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

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


为方便起见,这里是--illegal-accessJDK-11的文档:

--illegal-access=参数

在运行时出现时,--illegal-access=使用关键字parameter来指定操作模式:

笔记:

此选项将在未来版本中删除。

  • permit:此模式打开运行时映像中每个模块中的每个包,以在所有未命名模块(例如类路径上的代码)中编码,如果该包存在于 JDK 8 中。这将启用静态访问(例如,通过编译的字节码和深度反射访问)通过平台的各种反射 API。对任何此类包的第一次反射访问操作会导致发出警告。但是,在第一次发生后不会发出警告。此单个警告描述了如何启用更多警告。此模式是当前 JDK 的默认模式,但将在未来版本中更改。

  • warn: 这种模式permit除了为每个非法反射访问操作发出警告消息外,与此模式相同。

  • debug:warn除了针对每个非法反射访问操作发出警告消息和堆栈跟踪之外,此模式与此模式相同。

  • deny:此模式禁用所有非法访问操作,但由其他命令行选项启用的操作除外,例如--add-opens. 此模式将成为未来版本中的默认模式。

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

  • 如果组件的维护者已经发布了不再使用 JDK 内部 API 的固定版本,那么您可以考虑升级到该版本。

  • 如果该组件仍需要修复,那么您可以联系其维护人员并要求他们使用适当的导出 API 替换对 JDK 内部 API 的使用。

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

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

  • 要在运行时查询值,可以使用“ManagementFactory.getRuntimeMXBean().getInputArguments()”,请参阅/sf/answers/107239961/ (2认同)