首页 技术 正文
技术 2022年11月21日
0 收藏 421 点赞 3,002 浏览 1278 个字

1 问题描述

JDK9以上很多库都有这种非法反射访问的警告,比如protostuff

解决方法两个:

  • JDK降级
  • 添加JVM参数

2 原因

降到JDK8能解决以上问题。

但是这不是本文的重点。

先说一下出现该警告的原因,笔者使用的JDKOpenJDK 11JDK9以上模块不能使用反射去访问非公有的成员/成员方法以及构造方法,除非模块标识为opens去允许反射访问。旧JDK制作的库(JDK8及以下)运行在JDK9上会自动被标识为未命名模块,为了处理该警告,JDK9以上提出了一个新的JVM参数:--illegal-access

3 --illegal-access

该参数有四个可选值:

  • permit:默认值,允许通过反射访问,因此会提示像上面一样的警告,这个是首次非法访问警告,后续不警告
  • warn:每次非法访问都会警告
  • debug:在warn的基础上加入了类似e.printStackTrace()的功能
  • deny:禁止所有的非法访问除了使用特别的命令行参数排除的模块,比如使用--add-opens排除某些模块使其能够通过非法反射访问

因此解决的办法很简单,将其设置为deny,并添加--add-opens开启对应的允许非法反射访问的模块即可。

可以通过先设置为debug找到对应的非法访问的代码,比如protostuff中的非法反射访问代码段如下:

这都是JDK基本模块的代码,因此,添加--add-opens=java.base/java.lang.invoke=ALL-UNNAMED即可。--add-opens可以使模块中的包对其他模块开放,这样就可以在运行期使用深层反射访问该程序包中的所有成员类型。

4 总结

因此解决的办法是添加如下两个JVM参数:

--illegal-access=deny --add-opens java.base/java.lang=ALL-UNNAMED

IDEA可以在运行配置中的VM options中添加:

如果使用Maven打包的时候还是会出现警告,可以在IDEA中的Maven配置中添加全局的Maven参数:

另外,如果使用Gradle而不是Maven作为管理工具,Gradle测试的时候还是会显示警告,尽管Gradle运行配置里面有VM Options选项:

但在这里添加是没用的,正确的做法是在build.gradle中添加:

test {
useJUnitPlatform()
jvmArgs('--illegal-access=deny')
jvmArgs('--add-opens', 'java.base/java.lang.invoke=ALL-UNNAMED')
}

这样Gradle测试也没有问题了。

5 参考

相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:9,090
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,567
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,415
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,187
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:7,823
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:4,906