获取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不会对非法的静态访问操作发出警告
为什么在运行时需要该值?