本文解决的问题:
学习cglib代理模式的时候,建立一个普通的maven项目做demo遇到了这样一个报错:
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 @66cd51c3
at java.base/java.lang.reflect.AccessibleObject.throwInaccessibleObjectException(AccessibleObject.java:391)
at java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:367)
at java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:315)
at java.base/java.lang.reflect.Method.checkCanSetAccessible(Method.java:203)
at java.base/java.lang.reflect.Method.setAccessible(Method.java:197)
at net.sf.cglib.core.ReflectUtils$1.run(ReflectUtils.java:61)
at java.base/java.security.AccessController.doPrivileged(AccessController.java:571)
at net.sf.cglib.core.ReflectUtils.<clinit>(ReflectUtils.java:52)
at net.sf.cglib.core.KeyFactory$Generator.generateClass(KeyFactory.java:243)
at net.sf.cglib.core.DefaultGeneratorStrategy.generate(DefaultGeneratorStrategy.java:25)
at net.sf.cglib.core.AbstractClassGenerator.generate(AbstractClassGenerator.java:332)
... 14 more
解决办法一
这报错的原因是,jdk用了9以上版本。要解决这个问题,可以降jdk的版本和cglib依赖的版本。cglib的版本具体要降到多少版本我不知道,但2.2肯定可以,3.3.0肯定不行。
<dependency>
<groupId>cglib</groupId>
<artifactId>cglib</artifactId>
<version>2.2</version>
</dependency>
如果你遇到了这个报错:
java: 警告:源发行版 9 需要目标发行版 9
可以看一下这篇文章,很详细。http://t.csdnimg.cn/C5ECZ
解决办法二
看其他的文章或者问ai,很容易知道,在运行时加一些jvm配置就可以解决这个问题,但如何用idea加jvm配置,我不会。
解决办法三
新建一个spring boot项目引入这个依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
就可以解决,只需要引入这个依赖,不需要引入cglib的依赖,我看到一篇文章说,spring-core已经包含了cglib的依赖,并且解决了这个问题,好像是spring5.1几之后才解决的。
需要注意的是,这个类要导第一个: