Illegal reflective access by com.baomidou.mybatisplus.core.toolkit.SetAccessibleAction

WARNING: An illegal reflective access operation has occurred
WARNING: Illegal reflective access by com.baomidou.mybatisplus.core.toolkit.SetAccessibleAction (file:/D:/localRepository_Gradle/caches/modules-2/files-2.1/com.baomidou/mybatis-plus-core/3.5.2/d754592273020c1d1185fc0c7c12b6dfc60e48f2/mybatis-plus-core-3.5.2.jar) to field java.lang.invoke.SerializedLambda.capturingClass
WARNING: Please consider reporting this to the maintainers of com.baomidou.mybatisplus.core.toolkit.SetAccessibleAction
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

  • 反射访问限制:Java 9 开始引入了模块系统,对反射访问施加了更严格的管控。代码里若有通过反射访问私有字段、方法等操作,就可能违反这些限制从而触发警告。
  • MyBatis-Plus 版本问题:MyBatis-Plus 某些版本在使用反射时,可能未遵循 Java 9 及后续版本的新规则,进而引发非法反射访问警告。

1. 升级 MyBatis-Plus 版本

MyBatis-Plus 团队或许已经在后续版本中修复了这些反射访问问题。你可以尝试把 MyBatis-Plus 升级到最新版本。在 build.gradle 里进行如下修改:

implementation 'com.baomidou:mybatis-plus-boot-starter:最新版本号'

2. 启用反射访问

你能够通过 JVM 参数来启用非法反射访问,不过这仅仅是临时的解决办法,因为未来的 Java 版本可能会彻底禁止非法反射访问。在运行 Java 应用程序时添加如下 JVM 参数:

--illegal-access=permit

在 IDE 里添加 JVM 参数的方法:

  • IntelliJ IDEA:打开 Run/Debug Configurations,在 VM options 中添加 --illegal-access=permit
  • Eclipse:打开 Run Configurations,在 Arguments 标签页的 VM arguments 中添加 --illegal-access=permit
3. 忽略警告

要是你确认这些警告不会对应用程序的正常运行造成影响,也可以选择忽略它们。添加如下 JVM 参数:

--illegal-access=deny

15:32:16:652 ERROR 29324 --- [nio-8082-exec-1] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.builder.BuilderException: Error evaluating expression 'ew.sqlSegment != null and ew.sqlSegment != '' and ew.nonEmptyOfWhere'. Cause: org.apache.ibatis.ognl.OgnlException: sqlSegment [java.lang.NoClassDefFoundError: Could not initialize class com.baomidou.mybatisplus.core.toolkit.support.SerializedLambdaMeta]] with root cause java.lang.ExceptionInInitializerError: Exception java.lang.reflect.InaccessibleObjectException: Unable to make field private final java.lang.Class java.lang.invoke.SerializedLambda.capturingClass accessible: module java.base does not "opens java.lang.invoke" to unnamed module @5158b42f [in thread "http-nio-8082-exec-7"] at java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:354) ~[na:na] at java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:297) ~[na:na] at java.base/java.lang.reflect.Field.checkCanSetAccessible(Field.java:178) ~[na:na] at java.base/java.lang.reflect.Field.setAccessible(Field.java:172) ~[na:na] at com.baomidou.mybatisplus.core.toolkit.SetAccessibleAction.run(SetAccessibleAction.java:18) ~[mybatis-plus-core-3.4.3.jar:3.4.3] at com.baomidou.mybatisplus.core.toolkit.SetAccessibleAction.run(SetAccessibleAction.java:9) ~[mybatis-plus-core-3.4.3.jar:3.4.3] at java.base/java.security.AccessController.doPrivileged(AccessController.java:318) ~[na:na] at com.baomidou.mybatisplus.core.toolkit.ReflectionKit.setAccessible(ReflectionKit.java:203) ~[mybatis-plus-core-3.4.3.jar:3.4.3] at com.baomidou.mybatisplus.core.toolkit.support.SerializedLambdaMeta.<clinit>(SerializedLambdaMeta.java:19) ~[mybatis-plus-core-3.4.3.jar:3.4.3] at com.baomidou.mybatisplus.c
最新发布
07-17
### 回答1: 这是一个警告信息,意思是使用了不安全的反射方式访问了 org.apache.ibatis.reflection.reflector 类。这种方式可能会导致程序出现不可预测的行为,因此应该尽量避免使用。建议检查代码中是否存在使用反射的地方,并尽可能使用更安全的方式进行访问。 ### 回答2: org.apache.ibatis.reflection.reflector是MyBatis框架中的一个反射工具类,可以实现获取指定类的字段、方法等信息的功能。然而,在一些JDK版本中,由于JDK的安全机制加强,会出现“illegal reflective access”的警告信息,提示org.apache.ibatis.reflection.reflector在获取字段信息时使用了不允许的反射访问方式。 这个警告信息的原因是在JDK9开始,对反射机制有了限制,只允许通过类继承、实现接口或者通过运行时的权限等方式进行反射访问。而使用反射可以绕过Java语言本身的访问权限控制,存在安全隐患。因此,在JDK11中,Java规范中开始强制限制了反射方式的使用,只允许使用特定的反射API访问字段、方法等信息。 在MyBatis框架使用反射工具类时,如果使用了不允许的反射方式,就有可能出现“illegal reflective access”警告信息。这个问题可以通过升级MyBatis框架版本来解决。例如,升级到MyBatis 3.5.7版本及以上,就可以避免出现这个问题,因为MyBatis已经使用了允许的反射API来访问字段、方法等信息。 除了升级框架版本,还可以通过修改JVM参数来关闭反射访问检查,但这样会降低应用程序的安全性,不建议使用。如果确实需要绕过JDK的反射限制,可以使用Java.lang.reflect.AccessibleObject类提供的setAccessible方法进行反射访问,但需要注意,这样做有可能导致应用程序安全隐患,应慎重考虑。 ### 回答3: org.apache.ibatis.reflection.reflector是MyBatis框架中的一个类,它在执行反射操作时可能会出现“illegal reflective access”的警告信息。 这个警告信息的本质是Java 9引入的一个新特性,称为“模块化”。在Java 9之前,Java程序的所有类都处于同一个“类路径”下,可以随意访问和使用。但是,随着Java应用程序的逐渐复杂化和庞大化,这种无限制的访问方式逐渐体现出一些问题,比如安全性和性能问题。 因此,Java 9引入了模块化的概念,以将Java程序拆分成若干个不同的模块,每个模块有自己的类路径和访问规则。这样,不同的模块之间就可以实现相互隔离,同时提高了运行效率和安全性。 但是,由于许多Java应用程序都是在Java 8或更早版本上开发的,这些应用程序并没有采用模块化的机制。对于这些应用程序,在Java 9或更高版本上运行时,如果试图访问其他模块的私有API,就会导致“illegal reflective access”的警告信息。 在MyBatis框架中,org.apache.ibatis.reflection.reflector类可能在执行反射操作时访问了其他模块的私有API,导致了这个警告信息的出现。虽然该警告不会影响程序的正常运行,但为了避免潜在的安全和性能问题,建议使用最新版本的MyBatis框架,以支持Java 9及以上的模块化特性,从而避免这个警告信息的出现。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

spencer_tseng

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值