本文,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 的参数?
➥ 如何在运行时获取当前值?
最佳答案
那发生了吗?是否有 –illegal-access 设置?
是的,这似乎确实发生了——至少对于 OpenJDK/OracleJDK。该选项在 java
的文档中列出。 “工具”。
执行
java --help-extra
时也会列出。 .注意:JDK-11 文档提到此选项将在 future 版本中删除。
这些是怎么设置的?启动 JVM 的参数?
是的,它是一个命令行选项。例子:
java --illegal-access=deny --module-path <path> --module <module>/<main-class> [args...]
如何在运行时获取当前值?
不幸的是,我不知道有什么方法可以在运行时查询值。它似乎不是系统或环境属性的一部分。我尝试找到内部使用该值的位置,但无法找到(但说实话,我没有花太多时间查看)。
为方便起见,这里是
--illegal-access
的文档对于 JDK-11:--illegal-access=parameter
When present at run time,
--illegal-access=
takes a keywordparameter
to specify a mode of operation:Note:
This option will be removed in a future release.
permit
:此模式打开运行时镜像中每个模块中的每个包,以在所有未命名模块(例如类路径上的代码)中编码,如果该包存在于 JDK 8 中。这将启用静态访问(例如,通过编译的字节码和深度反射访问)通过平台的各种反射 API。对任何此类包的第一次反射访问操作会导致发出警告。但是,在第一次发生后不会发出警告。此单个警告描述了如何启用更多警告。此模式是当前 JDK 的默认模式,但将在 future 版本中更改。warn
: 此模式与permit
相同除了为每个非法的反射访问操作发出警告消息。debug
: 此模式与warn
相同除了为每个非法的反射访问操作发出警告消息和堆栈跟踪之外。deny
: 此模式禁用所有非法访问操作,但由其他命令行选项启用的操作除外,例如--add-opens
.此模式将成为 future 版本中的默认模式。
默认模式,--illegal-access=permit
, 旨在让您了解类路径上的代码,这些代码至少反射性地访问任何 JDK 内部 API 一次。要了解所有此类访问,您可以使用warn
或debug
模式。对于需要非法访问的类路径上的每个库或框架,您有两个选择:
如果组件的维护者已经发布了不再使用 JDK 内部 API 的固定版本,那么您可以考虑升级到该版本。 如果该组件仍需要修复,那么您可以联系其维护人员,并要求他们使用适当的导出 API 替换对 JDK 内部 API 的使用。
如果您必须继续使用需要非法访问的组件,那么您可以使用一个或多个--add-opens
来消除警告消息。选项以仅打开需要访问的那些内部包。
要验证您的应用程序是否已为 JDK 的 future 版本做好准备,请使用--illegal-access=deny
运行它。以及任何必要的--add-opens
选项。任何剩余的非法访问错误很可能是由于从编译代码到 JDK 内部 API 的静态引用。您可以通过运行 jdeps 来识别这些。带有--jdk-internals
的工具选项。出于性能原因,当前的 JDK 不会对非法静态访问操作发出警告。
关于java - 获取 Java 中 `-illegal-access` 设置的当前值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53790182/