Cglib動態代理
在開始之前需要導入包asm-2.2.3.jar 和 cglib-nodep.2.1_3jar在這里可以免費下載http://download.csdn.net/detail/jarremdon/9624537
CGLIB是一個強大的高性能的代碼生成包。他彌補了JDK動態代理的缺點就,沒有接口也可以使用代理
那就是Cglib動態代理,但是自己有一個局限性,代理的類是可以繼承的不能是final類,回顧代理模式
通常是通過接口或者子類繼承父類的方式來實現一類加強另一個類
下面以具體的代碼為例:
service類package com.tang.CglibProxy;
public class service {
public String services(){
return "My name is JarremDon";
}
}
代理類:CglibProxy
package com.tang.CglibProxy;
import java.lang.reflect.Method;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
public class CglibProxy implements MethodInterceptor {
//需要代理的原始類
public Object object;
public CglibProxy(Object object){
this.object=object;
}
public Object Proxy(){
//創建加強器
Enhancer enhancer=new Enhancer();
//設置需要加強的類
enhancer.setSuperclass(object.getClass());
//設置回調
enhancer.setCallback(this);
enhancer.setClassLoader(object.getClass().getClassLoader());
return enhancer.create();
}
@Override
public Object intercept(Object arg0, Method arg1, Object[] arg2,
MethodProxy arg3) throws Throwable {
//這里實現加強
Object invoke=arg3.invoke(object, arg2);
return invoke.toString().toUpperCase();
}
}
測試類:MyTest
package com.tang.CglibProxy;
public class MyTest {
public static void main(String args[]){
service s=new service();
CglibProxy proxy=new CglibProxy(s);
service s1=(service) proxy.Proxy();
System.out.println(s1.services());
}
}
CGLib創建的動態代理對象性能比JDK創建的動態代理對象的性能高不少,
但是CGLib在創建代理對象時所花費的時間卻比JDK多得多,所以對於單例的對象,
因為無需頻繁創建對象,用CGLib合適,反之,使用JDK方式要更為合適一些。同時,
由於CGLib由於是采用動態創建子類的方法,對於final方法,無法進行代理
