目录
一.问题描述
二.出错原因
三.问题解决
3.1方案一:
3.2方案二
特别注意:
四.总结
4.1修改settings文件
4.2升级依赖()的版本
4.3根据实际情况判断
参考:Proposal (revised): Allow illegal access to internal APIs by default in JDK 9
Java 9 揭秘(9. 打破模块封装) - 林本托 - 博客园
在起项目的时候遇到代码段的问题,但是不影响我们的程序启动,和调试,但是居然有错误那就应该好好找找看看是问题了,
报错日志:
WARNING: An illegal reflective access operation has occurred
WARNING: Illegal reflective access by org.springframework.cglib.core.ReflectUtils$1 (file:/D:/repository/I_repository_lasa/org/springframework/spring-core/5.0.9.RELEASE/spring-core-5.0.9.RELEASE.jar) to method java.lang.ClassLoader.defineClass(java.lang.String,byte[],int,int,java.security.ProtectionDomain)
WARNING: Please consider reporting this to the maintainers of org.springframework.cglib.core.ReflectUtils$1
WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations
WARNING: All illegal access operations will be denied in a future release
根据字面意思为:发生了非法的反射访问操作
非法的反射访问org.springframework.cglib.core。refectutils $1 (file:/D:/repository/I_repository_lasa/org/springframework/spring-core/5.0.9.RELEASE/spring-core-5.0.9.RELEASE.jar)到方法java.lang.ClassLoader.defineClass(java.lang.String,byte[],int,int,java.security.ProtectionDomain)
想了很久也没有弄明白是什么原因导致了控制台输出了这个警告,后面在网上查了查资料,发现是这么一回事:在JDK 8之前(包括java8) ,Java允许通过反射机制访问所有的成员,这些成员的类型包括私有(private),公共(public),包(< package >)和受保护(protected)。JDK9新增的功能之一 —— 模块系统对反射的行为做出了一定的限制。
从JDK9开始,对于非公有的成员、成员方法和构造方法,模块不能通过反射直接去访问,但是JDK9提供了一个可选的修饰符open来声明一个开放模块,可以从一个开放模块中导出所有的包,以便在运行时对该模块中的所有包中的所有类型进行深层反射来访问。
在出现这个问题之后我也根据这些在网上找了许多方法,可以归纳为两种
1.由于我们的依赖dependency太低,需要升级依赖版本
2.利用开发工具降低jdk版本(我这里使用的是JDK11出现了这个问题,将JDK11降级成JDK8之后警告就消失了)
快捷键:Ctrl+Shift+Alt+s
如图:
看一下修改完成后的运行结果:
程序报错没有了.
使用 --illegal-access 参数
其实这个参数在控制台输出的信息中已经给出了,如下
WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations
WARNING: All illegal access operations will be denied in a future release
其常用的参数值如下:
为了消除警告并继续使用需要进行非法访问的模块,可以将参数 --illegal-access的值设置为deny并使用一个或多个`–add opens 来打开对应的模块允许对其进行非法反射访问。
参数的书写方式:
参数 --add-opens java.base/java.base模块内的jar包名 = ALL-UNNAMED
以上两种方法是解决和我问题一样的解决方案,对于第一种要谨慎使用,如果还出错要注意修改settings里的java compiler中的版本号
有时候报错是因为我们的dependency版本太低所造成的,做法是在maven的pom.xml文件里面把我们需要的依赖升级,不需要更改我们的jdk版本
我们在解决问题时方法有很多,看看哪种方式更适合自己,不要轻易修改自己的配置或者自己的运行环境这个需要我们思考一下,虽然这个解决问题的方法有很多但是我觉的在实践中还会有许多解决问题的方法,欢迎大家来讨论.