Cglib是一个优秀的动态代理框架,它的底层使用ASM在内存中动态的生成被代理类的子类。使用CGLIB即使被代理类没有实现任何接口也可以实现动态代理功能。CGLIB具有简单易用,它的运行速度要远远快于JDK的Proxy动态代理:
使用CGLIB需要导入以下两个jar文件:
asm.jar– CGLIB的底层实现。
cglib.jar– CGLIB的核心jar包。
CGLIB的核心类:
net.sf.cglib.proxy.Enhancer– 主要的增强类
net.sf.cglib.proxy.MethodInterceptor – 主要的方法拦截类,它是Callback接口的子接口,需要用户实现
net.sf.cglib.proxy.MethodProxy – JDK的java.lang.reflect.Method类的代理类,可以方便的实现对源对象方法的调用,如使用:
Objecto = methodProxy.invokeSuper(proxy, args);//虽然第一个参数是被代理对象,也不会出现死循环的问题。
比较:
package czb.cglib;
import java.lang.reflect.Method;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
publicclassCglibDemo {
publicstatic void main(String[] args) {
//1.声明被代理的类
Object obj = new Person();//可以不写这个
// 2.声明cglib的增强类
Enhanceren = newEnhancer();
// 3.设置被代理的类
//en.setSuperclass(obj.getClass());
en.setSuperclass(Person.class);
// 4.设置回调,拦截方法
en.setCallback(new MethodInterceptor() {
@Override
public Object intercept(Objectproxy, Method method, Object[] args,
MethodProxymproxy)throwsThrowable {
System.err.println("拦截到了方法:"+method.getName());
//method.invoke(obj, args);//此方法被代理的类必须要final
ObjectreturnValue = mproxy.invokeSuper(proxy,args);
return returnValue;
}
});
//获取代理类,此类是原类的增强
Personp = (Person) en.create();
System.err.println(p.getClass()+"///"+obj.getClass());
p.say();
p.run();
}
}