CGLIB是第三方包,与JDK动态代理不同,不需要接口。
导包:
<!-- https://mvnrepository.com/artifact/cglib/cglib -->
<dependency>
<groupId>cglib</groupId>
<artifactId>cglib</artifactId>
<version>3.1</version>
</dependency>
类(需代理的类):
public class UserImp {
public void say(String str) {
System.out.println("asd"+str);
}
public void haha() {
System.out.println("哈哈");
}
}
动态代理类:
public class CGLIBProxy implements MethodInterceptor {
/*
* 获取代理对象
* 参数:
* obj:需代理对象的Class
* */
public Object getProxy(Class obj){
// CGLIB enhancer 增强类对象
Enhancer enhancer = new Enhancer();
// 设置需增强的类
enhancer.setSuperclass(obj);
// 定义代理逻辑对象为当前对象,必须实现MethodInterceptor接口
enhancer.setCallback(this);
// 生成并返回代理对象
return enhancer.create();
}
/*
* 代理方法执行逻辑
* */
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
System.out.println("调用真实对象前操作");
Object result = methodProxy.invokeSuper(o, objects);
System.out.println("调用真实对象后操作");
return result;
}
}
测试类:
/*
* CGLIB代理
* */
@Test
public void test1(){
CGLIBProxy cp = new CGLIBProxy();
UserImp proxy =(UserImp) cp.getProxy(UserImp.class);
proxy.say("aaa");
proxy.haha();
}
结果:
调用真实对象前操作
asdaaa
调用真实对象后操作
调用真实对象前操作
哈哈
调用真实对象后操作