当前使用版本(必填,否则不予处理)

3.4.3

该问题是如何引起的?(确定最新版也有问题再提!!!)

使用lambda查询时报错,JRE:16.0.1,Mybatisplus:3.4.3 ( JRE:16.0.1、Mybatisplus:3.4.0-3.4.2 或 JRE:11-15、Mybatisplus:3.4.3 无该问题)

重现步骤(如果有就写完整)

userMapper.selectOne(new LambdaQueryWrapper<User>()
    .select(User::getId)
    .eq(User::getId, userId)
    .last(" limit 1"));

报错信息

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 @7a69b07
    at java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:357)
    at java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:297)
    at java.base/java.lang.reflect.Field.checkCanSetAccessible(Field.java:177)
    at java.base/java.lang.reflect.Field.setAccessible(Field.java:171)
    at com.baomidou.mybatisplus.core.toolkit.SetAccessibleAction.run(SetAccessibleAction.java:18)
    at com.baomidou.mybatisplus.core.toolkit.SetAccessibleAction.run(SetAccessibleAction.java:9)
    at java.base/java.security.AccessController.doPrivileged(AccessController.java:312)
    at com.baomidou.mybatisplus.core.toolkit.ReflectionKit.setAccessible(ReflectionKit.java:203)
    at com.baomidou.mybatisplus.core.toolkit.support.SerializedLambdaMeta.<clinit>(SerializedLambdaMeta.java:19)
    at com.baomidou.mybatisplus.core.toolkit.LambdaUtils.extract(LambdaUtils.java:55)
    at com.baomidou.mybatisplus.core.conditions.AbstractLambdaWrapper.getColumnCache(AbstractLambdaWrapper.java:75)
    at com.baomidou.mybatisplus.core.conditions.AbstractLambdaWrapper.columnToString(AbstractLambdaWrapper.java:62)
    at com.baomidou.mybatisplus.core.conditions.AbstractLambdaWrapper.lambda$columnsToString$0(AbstractLambdaWrapper.java:53)
    at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197)
    at java.base/java.util.Spliterators$ArraySpliterator.forEachRemaining(Spliterators.java:948)
    at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:484)
    at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:474)
    at java.base/java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:913)
    at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
    at java.base/java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:682)
    at com.baomidou.mybatisplus.core.conditions.AbstractLambdaWrapper.columnsToString(AbstractLambdaWrapper.java:53)
    at com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper.select(LambdaQueryWrapper.java:84)

Comment From: nancheung

该问题应当是由于JDK16引入的 JEP 396 特性造成。其实JDK9开始就已经引入了宽松强封装,但是JDK16进一步提高了JDK的安全性,默认情况下强封装JDK内部使其无法被非法访问(深度反射)。该特性已造成大量框架的现有代码无法正常运行。

3.4.3修改了识别Lambda的机制,见 #3517 。使用了反射,因而触发 JEP 396 的限制。

目前可以通过 JVM启动参数 --illegal-access=permit 以解除限制。见 JEP 396 或者使用 --add-opens java.base/java.lang.invoke=ALL-UNNAMED 。见 --add-opens

Comment From: qmdx

版本 3.4.3.2 已发布,请升级验证修复该问题,有任何问题 issue 该问题关闭!