Java动态代理—CGLIB DynamicProxy
Posted Moon&&Dragon
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java动态代理—CGLIB DynamicProxy相关的知识,希望对你有一定的参考价值。
动态代理—CGLIB DynamicProxy
CGLIB是利用ASM开源包,对代理对象类的class文件加载进来,通过修改其字节码生成子类来处理。
1 CGLIB和JDK的区别
JDK | CGLIB |
---|---|
基于接口实现 | 基于基础(目标类不能被final 修饰) |
2 导入依赖
<dependency>
<groupId>cglib</groupId>
<artifactId>cglib</artifactId>
<version>2.2.2</version>
</dependency>
3 实现MethodInterceptor接口
/**
* @author 晓龙
* @version 1.8.271
* @ProtectName Proxy
* @ClassName MyCglibProxy
* @Description 基于Cglib动态代理
* @createTime 2021年05月29日 20:37:00
*/
public class MyCglibProxy implements MethodInterceptor {
/**
* @param o 目标对象
* @param method 拦截方法
* @param objects 目标方法参数
* @param methodProxy 目标方法
* @return 目标的返回值
* @throws Throwable 目标方法的异常
*/
@Override
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
Object o1 = methodProxy.invokeSuper(o, objects);
System.out.println("来自Cglib");
return o1;
}
}
4 实例Enhancer对象
public Object getProxy(Object target) {
Enhancer enhancer = new Enhancer();
// 设置父类(目标对象类)class
enhancer.setSuperclass(target.getClass());
// 设置回调器
enhancer.setCallback(this);
// 生成代理对象
Object o = enhancer.create();
return o;
}
5 测试类
public class App {
public static void main(String[] args) {
// 目标对象
HouseService houseService = new HouseService();
// cglib代理类
MyCglibProxy myCglibProxy = new MyCglibProxy();
// 获得代理
HouseService proxy = (HouseService) myCglibProxy.getProxy(houseService);
// 目标方法
proxy.rentHouse();
}
}
以上是关于Java动态代理—CGLIB DynamicProxy的主要内容,如果未能解决你的问题,请参考以下文章