Cglib動態代理


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM