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