Cglib(Code Generation Library)动态代理 [对没有实现接口的普通类做代理]
1、概述:
Cglib是一个优秀的动态代理框架,它的底层使用ASM(JAVA字节码处理框架)在内存中动态的生成被代理类的子类。使用CGLIB即使被代理类没有实现任何接口也可以实现动态代理功能。但是不能对final修饰的类进行代理。
2、原理:
通过字节码技术为一个类创建子类,并在子类中采用方法拦截的技术拦截所有父类方法的调用。
(JDK动态代理与CGLib动态代理均是实现Spring AOP的基础)
3、使用:
使用Cglib前需要导入以下两个jar文件:
asm.jar – Cglib的底层实现。
【cglib包的底层是使用字节码处理框架ASM来转换字节码并生成新的类,所以cglib包要依赖于asm包】
cglib.jar - Cglib的核心jar包
下面用一个例子说明Cglib的使用。
1) 目标类,或真实类
public class CglibRealObject {
public void doSomething(){
System.out.println("doSomething thing method in CglibRealObject");
}
}
2)生成动态代理的类
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
import java.lang.reflect.Method;
public class CglibDynamicProxy implements MethodInterceptor {
private Object proxied;
public Object getProxyInstance(Object proxied){
this.proxied = proxied;
//声明增强类实例
Enhancer enhancer = new Enhancer();
//设置被代理类字节码,CGLIB根据字节码生成被代理类的子类
enhancer.setSuperclass(this.proxied.getClass());
//设置要代理的拦截器,回调函数,即一个方法拦截
enhancer.setCallback(this);
//创建代理对象 实例
return enhancer.create();
}
@Override
public Object intercept(Object o, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
//在处理前做一些事情
System.out.println("before doSomething method, do other things");
methodProxy.invokeSuper(o,args);
//在处理后最一些事情
System.out.println("after doSomething method");
return null;
}
}
3)、测试类
public class CglibTest {
public static void main(String[] args){
//用new创建一个动态代理类
CglibDynamicProxy proxy = new CglibDynamicProxy();
//用这个动态代理类 生成 一个真实类的代理
CglibRealObject realObject = (CglibRealObject) proxy.getProxyInstance(new CglibRealObject());
//用这个返回值调用方法
realObject.doSomething();
}
}
输出结果为
before doSomething method, do other things
doSomething thing method in CglibRealObject
after doSomething method
原文地址:http://blog.csdn.net/janice0529/article/details/42884019