代码之家  ›  专栏  ›  技术社区  ›  Basil Bourque

在Java中获取“非法访问”设置的当前值

  •  0
  • Basil Bourque  · 技术社区  · 6 年前

    这篇文章, 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

    发生了吗?有没有 _“非法访问 设置?

    这些是怎么设置的?启动JVM的参数?

    运行时如何获取当前值?

    1 回复  |  直到 6 年前
        1
  •  1
  •   Slaw    6 年前

    发生了吗?是否存在非法访问设置?

    是的,至少对于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不会对非法静态访问操作发出警告。