1. 程式人生 > >java,簡單實現cglib動態代理。

java,簡單實現cglib動態代理。

Cglib是動態代理的一種實現方式,用來代理普通的javaBean,

/**
 * 實現MethodInterceptor
 * @author MyComputer
 *
 */
public class CGLibProxy   implements MethodInterceptor{
	// Generates dynamic subclasses to enable method interception
	private Enhancer  enhancer = new Enhancer();
	
	/**
	 * this 表示為回撥函式,此處為執行代理時候執行的一些操作
	 * @param suoperClass 使用者代理的父類
	 * @return 
	 */
	public <T>T getProyInfo(Class<T> suoperClass){
		 
		return (T)enhancer.create(suoperClass,this);
	}
	
	/**
	 * enhancer.create()的返回物件呼叫方法時候進入的攔截方法,可以執行自己的邏輯
	 */
	@Override
	public Object intercept(Object obj, Method method, Object[] args,
			MethodProxy proxy) throws Throwable {
		 System.err.println("-------呼叫方法之前---------------");
		 // 呼叫父類中方法
		 Object invokeSuper = proxy.invokeSuper(obj, args);
		 System.err.println("-------呼叫方法之後---------------");
		return invokeSuper;
	}

}
public class CGLibTest {

	 public String cgLibTest(String str){
		 System.err.println("-----------------呼叫反射方法傳入的param為:------"+str);
		 return "呼叫反射方法返回"+str;
	 }
	 
	 /**
	  * 此處用test測試,如果用main方法測試,則回報錯誤:
	  * java.lang.NoClassDefFoundError: net/sf/cglib/proxy/MethodInterceptor
	  * 這是由於此時沒有專案中的jar包沒有用maven管理,無法打到依賴專案的目的。
	  */
	 @Test
	 public   void test() {
		CGLibProxy cgLibProxy = new CGLibProxy();
		CGLibTest proyInfo = cgLibProxy.getProyInfo(CGLibTest.class);
		String cgLibTest = proyInfo.cgLibTest("呼叫反射");
		System.err.println(cgLibTest);	
	}
}

最終輸出的結果為:

-------呼叫方法之前--------------- -----------------呼叫反射方法傳入的param為:------呼叫反射 -------呼叫方法之後--------------- 呼叫反射方法返回呼叫反射