日志报错:WARNING: An illegal reflective access operation has occurred

目录

一.问题描述

 二.出错原因

三.问题解决

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来声明一个开放模块,可以从一个开放模块中导出所有的包,以便在运行时对该模块中的所有包中的所有类型进行深层反射来访问。

三.问题解决

    在出现这个问题之后我也根据这些在网上找了许多方法,可以归纳为两种

3.1方案一:

    1.由于我们的依赖dependency太低,需要升级依赖版本

    2.利用开发工具降低jdk版本(我这里使用的是JDK11出现了这个问题,将JDK11降级成JDK8之后警告就消失了)

    快捷键:Ctrl+Shift+Alt+s

  如图:

日志报错:WARNING: An illegal reflective access operation has occurred_第1张图片日志报错:WARNING: An illegal reflective access operation has occurred_第2张图片

   看一下修改完成后的运行结果:

   程序报错没有了.

日志报错:WARNING: An illegal reflective access operation has occurred_第3张图片

 3.2方案二

     使用 --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

   其常用的参数值如下:

  • permit 默认行为,允许通过反射进行访问。当第一次尝试通过反射进行非法访问时会生成一个警告,之后不会再进行警告。
  • warn 与permit相同,但每次非法访问时都会产生警告。其大致等效于 “–permit-illegal-access”。
  • debug 每次非法访问产生警告的同时打印非法访问的堆栈跟踪信息。
  • deny 不允许所有的非法访问操作,除了启用其它命令行参数排除的模块,例如"–add-opens",这个参数可以参数将某些模块排除出来,让它们能够通过非法反射进行访问

     为了消除警告并继续使用需要进行非法访问的模块,可以将参数 --illegal-access的值设置为deny并使用一个或多个`–add opens 来打开对应的模块允许对其进行非法反射访问。

日志报错:WARNING: An illegal reflective access operation has occurred_第4张图片

    特别注意: 

      参数的书写方式:

参数 --add-opens  java.base/java.base模块内的jar包名 = ALL-UNNAMED 

四.总结

    4.1修改settings文件

    以上两种方法是解决和我问题一样的解决方案,对于第一种要谨慎使用,如果还出错要注意修改settings里的java compiler中的版本号

    4.2升级依赖()的版本

    有时候报错是因为我们的dependency版本太低所造成的,做法是在maven的pom.xml文件里面把我们需要的依赖升级,不需要更改我们的jdk版本

    4.3根据实际情况判断

   我们在解决问题时方法有很多,看看哪种方式更适合自己,不要轻易修改自己的配置或者自己的运行环境这个需要我们思考一下,虽然这个解决问题的方法有很多但是我觉的在实践中还会有许多解决问题的方法,欢迎大家来讨论.

你可能感兴趣的:(java,idea,maven)