目录
- 原因:
- 解决方法:
- 方法一:
- 方法二:
- 方法三:
SpringBoot项目运行报如下错误
Caused by: java.lang.reflect.InaccessibleObjectException: Unable to make protected final java.lang.Class java.lang.ClassLoader.defineClass(java.lang.String,byte[],int,int,java.security.ProtectionDomain) throws java.lang.ClassFormatError accessible: module java.base does not "opens java.lang" to unnamed module @7744eae3
at java.base/java.lang.reflect.AccessibleObject.throwInaccessibleObjectException(AccessibleObject.java:388) ~[na:na]
at java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:364) ~[na:na]
at java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:312) ~[na:na]
at java.base/java.lang.reflect.Method.checkCanSetAccessible(Method.java:203) ~[na:na]
at java.base/java.lang.reflect.Method.setAccessible(Method.java:197) ~[na:na]
at org.springframework.cglib.core.ReflectUtils$1.run(ReflectUtils.java:61) ~[spring-core-5.0.9.RELEASE.jar:5.0.9.RELEASE]
at java.base/java.security.AccessController.doPrivileged(AccessController.java:571) ~[na:na]
at org.springframework.cglib.core.ReflectUtils.<clinit>(ReflectUtils.java:52) ~[spring-core-5.0.9.RELEASE.jar:5.0.9.RELEASE]
at org.springframework.cglib.core.KeyFactory$Generator.generateClass(KeyFactory.java:243) ~[spring-core-5.0.9.RELEASE.jar:5.0.9.RELEASE]
at org.springframework.cglib.core.DefaultGeneratorStrategy.generate(DefaultGeneratorStrategy.java:25) ~[spring-core-5.0.9.RELEASE.jar:5.0.9.RELEASE]
at org.springframework.cglib.core.AbstractClassGenerator.generate(AbstractClassGenerator.java:329) ~[spring-core-5.0.9.RELEASE.jar:5.0.9.RELEASE]
... 31 common frames omitted
原因:
在Java 9及以后的版本中,模块系统增加了对反射访问的控制,以确保Java平台的稳定性和安全性。默认情况下,Java的核心模块(如java.base)不允许被其他模块反射访问。
解决方法:
方法一:
直接更换项目jdk版本到8即可,简单粗暴
方法二:
如果你正在编写的代码属于一个模块,并且需要反射访问java.lang包中的类,你可以在模块的module-info.java文件中添加以下声明:
opens java.lang;
这将允许反射访问java.lang包中所有的类型。
如果你不需要反射访问java.lang包中的所有类型,而只是某些特定的类型,你可以只开放那些特定的类型:
opens java.lang to your.module.name;
//your.module.name为你的模块名。
方法三:
如果你不能修改module-info.java文件(比如使用的是第三方库),那么你可能需要寻找替代方法来实现你的需求,而不是使用反射来访问java.lang包中的类型。