CGLIB动态代理
https://www.cnblogs.com/tnt-33/articles/10149087.html
注意jdk动态代理,只代理接口,不支持类的动态代理
jdk动态原理:利用InvocationHanlder加上反射机制生成一个实现代理接口的匿名类,在调用具体方法前调用InvokeHandler来处理。是在程序运行的过程中,根据被代理的接口来动态生成代理类的class文件,并加载运行的过程。
CGLIB动态代理可以代理类
CGLib采用了非常底层的字节码技术,其原理是通过字节码技术为一个类创建子类,并在子类中采用方法拦截的技术拦截所有父类方法的调用,顺势织入横切逻辑。(利用ASM开源包,对代理对象类的class文件加载进来,通过修改其字节码生成子类来处理)
CGLib代理实例
创建被代理类
public class SayHello {
public void say(){
System.out.println("hello");
}
}
创建代理类
public class ProxyCglib implements MethodInterceptor{
private Enhancer enhancer = new Enhancer();
public Object getProxy(Class clazz){
//设置需要创建子类的类
enhancer.setSuperclass(clazz);
enhancer.setCallback(this);
//通过字节码技术动态创建子类实例
return enhancer.create();
}
//实现MethodInterceptor接口方法
public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
System.out.println("可以在调用实际方法前做一些事情");
//通过代理类调用父类中的方法
Object result = proxy.invokeSuper(obj, args);
System.out.println("可以在调用实际方法后做一些事情");
return result;
}
}
测试
public class Mytest {
public static void main(String[] args) {
ProxyCglib proxy = new ProxyCglib();
//通过生成子类的方式创建代理类
SayHello proxyImp = (SayHello)proxy.getProxy(SayHello.class);
proxyImp.say();
}
}