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

时间:2018-12-15 06:38:00

标签: java reflection settings

本文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的争论?

➥在运行时如何获取当前值?

1 个答案:

答案 0 :(得分:2)

发生了吗?有–非法访问设置吗?

是的,看来确实发生了-至少对于OpenJDK / OracleJDK。该选项在java“工具”的文档中列出。

在执行java --help-extra时也会列出。

注意:JDK-11文档提到此选项将在以后的版本中删除。


这些如何设置?关于启动JVM的争论吗?

是的,它是一个命令行选项。示例:

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。要了解所有此类访问,可以使用warndebug模式。对于类路径上需要非法访问的每个库或框架,您有两个选择:

     
      
  • 如果组件的维护者已经发布了不再使用JDK内部API的固定版本,则可以考虑升级到该版本。

  •   
  • 如果仍然需要修复该组件,则可以联系其维护者,并要求他们使用适当的导出API替换其对JDK内部API的使用。

  •   
     

如果必须继续使用需要非法访问的组件,则可以通过使用一个或多个--add-opens选项仅打开那些需要访问权限的内部软件包来消除警告消息。

     

要验证您的应用程序已准备好用于将来的JDK版本,请使用--illegal-access=deny以及任何必要的--add-opens选项运行它。任何剩余的非法访问错误很可能是由于从编译代码到JDK内部API的静态引用所致。您可以通过使用--jdk-internals选项运行jdeps工具来识别它们。出于性能原因,当前的JDK不会针对非法的静态访问操作发出警告。