引入:本文面向人群CGLIB代理与JDK9+版本不兼容导致的报错
public class DynamicMain {
public static void main(String[] args) {
//subject可以翻译为对象,代理对象
HouseSubject target= new RealHouseSubject();
//创建一个代理对象
HouseSubject proxy = (HouseSubject)
Enhancer.create(target.getClass(), new CGLIBInterceptor(target));
proxy.rentHouse();
}
}
package com.example.springaop.brokerdemo2;
import lombok.val;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
import java.lang.reflect.Method;
import java.sql.SQLOutput;
/**
* Created with IntelliJ IDEA.
* Description:
* User: Hua YY
* Date: 2024-12-30
* Time: 11:25
*/
public class CGLIBInterceptor implements MethodInterceptor {
//目标对象,被代理的对象
private Object target;
public CGLIBInterceptor(Object target){
this.target = target;
}
@Override
public Object intercept(Object o, Method method
, Object[] objects, MethodProxy methodProxy) throws Throwable {
//代理增强内容
System.out.println("我是中介,开始代理");
//调用方法(反射机制)
Object retVal = method.invoke(target, objects);
//代理增强内容
System.out.println("我是中介,代理结束");
return retVal;
}
}
首先想到的是JDK版本过高,于是改用JDK8,依然报错,于是降低CJLIB版本依赖,再分别进行测试依旧报错。
该错误的根本原因是 Java 9+ 模块化(JPMS)导致的问题。在 JDK 9 引入了模块系统之后,CGLIB 在动态生成代理类时,需要访问 java.lang.ClassLoader
的一些内部方法,但是 Java 的模块系统限制了对这些方法的访问。具体来说,java.base
模块没有开放 java.lang
包中的一些类和方法给其他模块,导致 CGLIB 无法访问这些方法,最终抛出了 InaccessibleObjectException
。
修改 IDE 配置(如果使用 IntelliJ IDEA)
如果你是通过 IntelliJ IDEA 运行程序,可以在运行/调试配置中添加该参数:
DynamicMain
)。
--add-opens java.base/java.lang=ALL-UNNAMED
4:具体操作步骤如下
代码运行成功