报错:

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 @1bb5a082

解决:

Mybatis-Plus版本改为3.5.7。

解析:

java.lang.reflect.InaccessibleObjectException 错误通常出现在使用 Java 9 及更高版本时,特别是当尝试通过反射访问某些 Java 基础类库中的私有字段或方法时。这个错误信息表示无法访问 java.lang.invoke.SerializedLambda 类中的 capturingClass 字段,因为 Java 9 引入了模块系统(JPMS),并对模块的可访问性进行了限制。

错误原因

  1. 模块系统:在 Java 9 及更高版本中,Java 引入了模块化的概念,默认情况下,某些类和字段(尤其是 java.base 模块中的类)是不可访问的。SerializedLambda 中的 capturingClass 字段是私有的,因此如果没有适当的访问权限,会导致 InaccessibleObjectException

  2. MyBatis-Plus 版本:MyBatis-Plus 3.5.7 版本可能修复了与反射相关的问题,尤其是涉及到使用 SerializedLambda 时的访问权限。这可能是因为 MyBatis-Plus 团队在该版本中做了某些更改,避免了对反射的依赖,或者为反射的使用提供了适当的 JVM 参数说明。

解决方案

  1. 更新 MyBatis-Plus:如果使用 MyBatis-Plus 3.5.7 版本能够解决问题,建议继续使用该版本,或者查看是否有更新版本以获得更多功能和修复。

  2. 添加 JVM 参数:如果需要使用更高版本的 MyBatis-Plus,仍然可以尝试通过添加 JVM 参数来打开相关模块的访问权限:

    --add-opens java.base/java.lang.invoke=ALL-UNNAMED
    

    这样可以让你的代码在运行时访问被限制的类和字段。

  3. 检查依赖库的版本:确保其他相关依赖库(如 Spring、Lombok 等)也是兼容的版本,有时候不兼容的依赖库也可能导致类似问题。

  4. 代码审查:检查代码中是否有使用反射的地方,尽量避免直接访问私有字段或方法。可以通过其他方法实现相同功能。

总结

总的来说,InaccessibleObjectException 错误是由于 Java 9 及更高版本的模块化引起的。使用 MyBatis-Plus 3.5.7 版本解决了这个问题,可能是因为该版本对反射的使用进行了改进或修复。如果需要使用其他版本,考虑使用 JVM 参数或检查代码的实现。

Logo

技术共进,成长同行——讯飞AI开发者社区

更多推荐