获取 Java 中“非法访问”设置的当前值

2022-09-03 06:57:36

本文 JDK 9:默认允许非法反射访问的建议声称,该选项将被更通用的选项所取代。–permit-illegal-access–illegal-access

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

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

➥ 这些是如何设置的?启动 JVM 的参数?

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


答案 1

这是真的吗?是否存在非法访问设置?

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

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

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


这些是如何设置的?启动 JVM 的参数?

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

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

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

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


为方便起见,以下是针对 JDK-11 的文档:--illegal-access

--非法访问=参数

在运行时存在时,采用关键字参数来指定操作模式:--illegal-access=

注意:

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

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

  • warn:此模式与每个非法反射访问操作发出警告消息相同。permit

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

  • deny:此模式禁用除其他命令行选项(如 .此模式将成为未来版本中的默认模式。--add-opens

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

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

  • 如果组件仍然需要修复,那么你可以联系它的维护者,要求他们用正确导出的API替换他们对JDK内部API的使用。

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

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


答案 2