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();
}
}