动态代理(CGLIB实现)
Posted 如若千夫所指
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了动态代理(CGLIB实现)相关的知识,希望对你有一定的参考价值。
CGLIB(Code Generation Library)是一个开源项目。可以直接对类进行增强,而不需要像JDK的动态代理,需要增强的类必须实现某接口
在使用Spring框架时,因为Spring框架中core包中引入了cglib所以如果想通过cglib来实现动态代理,不需要专门的导cglib的jar包。
创建代理工厂时,必须得实现MethodInterceptor接口,因为通过cglib创建的代理对象在调方法时会默认执行intercept方法,通过该方法增加目标对象方法。
public class CglibProxyFactory implements MethodInterceptor {
//通过构造方法,把目标对象传进来
private Object target;
public CglibProxyFactory(Object target) {
this.target = target;
}
//得到代理对象
public Object getProxyObject() {
Enhancer enhancer = new Enhancer(); //实例化cglib代理增强器-
enhancer.setSuperclass(target.getClass()); //设置目标的类:通过目标类对象来生成代理子对象
enhancer.setCallback(this); //回调方法 参数:回调的对象
return enhancer.create(); // 通过增强器得到代理对象
}
//增强目标对象方法
@Override
public Object intercept(
Object proxy, //代理对象
Method method, //目标对象的方法
Object[] args, //需要增强的方法的参数
MethodProxy proxyMethod //代理对象的方法继承目标对象的方法(method)
) throws Throwable {
System.out.println("前置增强");
//直接调用目标对象的方法(目标方法执行方式1)
Object value = method.invoke(target, args);
//调用代理代理对象的父类方法,相当于间接调用目标对象的方法(目标方法执行方式2)
Object value = proxyMethod.invokeSuper(proxy, args);
System.out.println("后置增强");
return value;
}
}
以上是关于动态代理(CGLIB实现)的主要内容,如果未能解决你的问题,请参考以下文章
jdk动态代理和cglib动态代理底层实现原理详细解析(cglib动态代理篇)