Bas*_*que 15 java reflection settings
本文JDK 9: Proposal to allow非法反射访问默认情况下,声称该–permit-illegal-access选项将被更通用的选项–illegal-access.
–illegal-access=permit–illegal-access=warn–illegal-access=debug–illegal-access=deny? 那发生了吗?有–illegal-access设置吗?
? 这些是怎么设置的?启动 JVM 的参数?
? 如何在运行时获取当前值?
Sla*_*law 15
是的,这似乎确实发生了——至少对于 OpenJDK/OracleJDK。该选项列在java“工具”的文档中。
它也在执行时列出java --help-extra。
注意:JDK-11 文档提到此选项将在未来版本中删除。
是的,它是一个命令行选项。例子:
java --illegal-access=deny --module-path <path> --module <module>/<main-class> [args...]
Run Code Online (Sandbox Code Playgroud)
不幸的是,我不知道在运行时查询值的任何方法。它似乎不是系统或环境属性的一部分。我尝试找到内部使用该值的位置,但无法找到(但说实话,我没有花太多时间查看)。
为方便起见,这里是--illegal-accessJDK-11的文档:
--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 的静态引用。您可以通过运行带有该选项的jdeps工具来识别这些--jdk-internals。出于性能原因,当前的 JDK 不会对非法静态访问操作发出警告。
| 归档时间: |
|
| 查看次数: |
18031 次 |
| 最近记录: |