发生了吗?是否存在非法访问设置?
是的,至少对于openjdk/oraclejdk来说是这样的。该选项列在
java
“工具”。
执行时也会列出
java --help-extra
.
注意:JDK-11文档中提到的这个选项将在将来的版本中被删除。
这套怎么样?启动JVM的参数?
是的,这是一个命令行选项。例子:
java --illegal-access=deny --module-path <path> --module <module>/<main-class> [args...]
如何在运行时获取当前值?
不幸的是,我不知道在运行时如何查询该值。它似乎不是系统或环境属性的一部分。我试着在内部找到使用价值的地方,但无法找到(但老实说,我没有花太多时间去寻找)。
为了方便起见,这是
--illegal-access
JDK-11:
--非法访问=参数
在运行时出现时,
--illegal-access=
取关键字
parameter
要指定操作模式:
注:
此选项将在将来的版本中删除。
-
permit
:此模式将打开运行时映像中每个模块中的每个包,以便在JDK 8中存在该包的情况下,在所有未命名模块(如类路径上的代码)中进行编码。这样就可以通过平台的各种反射API实现静态访问(例如,通过编译的字节码和深度反射访问)。对任何此类包的第一个反射访问操作都会导致发出警告。但是,第一次出现后不会发出警告。此单个警告说明如何启用进一步的警告。此模式是当前JDK的默认模式,但在将来的版本中将更改。
-
warn
:此模式与
许可证
但对于每个非法的反射访问操作都会发出警告消息。
-
debug
:此模式与
警告
但是,对于每个非法的反射访问操作,都会发出警告消息和堆栈跟踪。
-
deny
:此模式禁用所有非法访问操作,由其他命令行选项启用的操作除外,例如
--add-opens
.在将来的版本中,此模式将成为默认模式。
默认模式,
--illegal-access=permit
,旨在使您了解类路径上至少一次反射性访问任何JDK内部API的代码。要了解所有此类访问,可以使用
警告
或
调试
模式。对于类路径上需要非法访问的每个库或框架,您有两个选项:
-
如果组件的维护人员已经发布了不再使用JDK内部API的固定版本,那么您可以考虑升级到该版本。
-
如果组件仍然需要修复,那么您可以联系其维护人员,要求他们用正确的导出API替换对JDK内部API的使用。
如果必须继续使用需要非法访问的组件,则可以使用一个或多个来消除警告消息。
--添加打开
仅打开需要访问的内部包的选项。
要验证您的应用程序是否已准备好迎接JDK的未来版本,请使用
--illegal-access=deny
以及任何必要的
--添加打开
选项。任何剩余的非法访问错误都很可能是由于从编译代码到JDK内部API的静态引用造成的。您可以通过运行
jdeps
工具与
--jdk-internals
选择权。出于性能原因,当前的JDK不会对非法静态访问操作发出警告。