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

获取Java中的“%非法访问”设置的当前值,java,reflection,settings,Java,Reflection,Settings,本文声称,–允许非法访问选项将被一个更通用的选项取代,–非法访问 –非法访问=许可证 –非法访问=警告 –非法访问=调试 –非法访问=拒绝 ➥ 那是真的吗?是否存在–非法访问设置 ➥ 这些是怎么设置的?启动JVM的参数 ➥ 运行时如何获取当前值?是否发生了这种情况?是否存在–非法访问设置? 是的,至少在OpenJDK/OracleJDK中出现了这种情况。该选项列在java“工具”的文档中 执行java--help extra时也会列出它 注意:JDK-11文档提到此选项将在将来的版

本文声称,
–允许非法访问
选项将被一个更通用的选项取代,
–非法访问

  • –非法访问=许可证
  • –非法访问=警告
  • –非法访问=调试
  • –非法访问=拒绝
➥ 那是真的吗?是否存在
–非法访问
设置

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

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

是否发生了这种情况?是否存在–非法访问设置? 是的,至少在OpenJDK/OracleJDK中出现了这种情况。该选项列在
java
“工具”的文档中

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

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


这些是怎么设置的?启动JVM的参数? 是的,它是一个命令行选项。例如:

java--非法访问=拒绝--模块路径--模块/[args…]

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


为方便起见,以下是JDK-11的
--非法访问
文档:

--非法访问=参数 当在运行时出现时,
--非法访问=
采用关键字
参数来指定操作模式:

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

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

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

  • debug
    :此模式与
    warn
    相同,只是针对每个非法反射访问操作都会发出警告消息和堆栈跟踪

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

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

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

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

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

要验证您的应用程序是否已为JDK的未来版本做好准备,请使用
--非法访问=拒绝
以及任何必要的
--添加打开
选项运行它。任何剩余的非法访问错误都很可能是由于编译代码对JDK内部API的静态引用造成的。您可以通过使用
--jdk internals
选项运行该工具来识别它们。出于性能原因,当前的JDK不会对非法的静态访问操作发出警告


为什么在运行时需要该值?