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方法,無法進行代理