繼續上一篇,JDK多重動態代理

代碼依舊是上篇的那些,唯一改的就是新加的兩個Proxy,代碼在上篇,這裏就不貼了  java動態代理  ,代碼如下:


JDKProxy$1.java

import java.lang.reflect.Method;

public class JDKProxy$1 extends BaseJDKProxy {

	public JDKProxy$1(Object target) {
		super(target);
		// TODO Auto-generated constructor stub
	}

	@Override
	public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
		System.out.println("----------------------------------------");
		System.out.println("代理JDKProxy$1");
		before();
		Object invoke = method.invoke(target, args);
		after();
		return invoke;
	}

}
第二個代理與上面代碼一樣

直接看調用 :

//main方法中的代碼替換成如下,即可添加多個動態代理
LoginService login = new Login();
BaseJDKProxy proxy$1 = new JDKProxy$1(login);
LoginService loginProxy$1 = (LoginService) Proxy.newProxyInstance(login.getClass().getClassLoader(), login.getClass().getInterfaces(), proxy$1);
BaseJDKProxy proxy$2 = new JDKProxy$2(loginProxy$1);
LoginService loginProxy$2 = (LoginService) Proxy.newProxyInstance(loginProxy$1.getClass().getClassLoader(), loginProxy$1.getClass().getInterfaces(), proxy$2);
loginProxy$2.login();

日誌輸出如下:

----------------------------------------
代理JDKProxy$2
方法執行前操作.......
----------------------------------------
代理JDKProxy$1
方法執行前操作.......
登錄成功
方法執行後操作.......
方法執行後操作.......


至於是否需要添加多個動態代理,跟據本身的需求而定

此處提及一下上一篇,剛開始創造了一個Null的BUG,可以看到日誌運行到輸出異常後,被中斷了,後面的方法沒有被繼續調用

而使用多個動態代理,故意在Proxy$1中創建了一個bug,可以看日誌輸出如下,並沒有因爲某個地方出現錯誤而中斷後續的運行:

----------------------------------------
代理JDKProxy$2
方法執行前操作.......
----------------------------------------
代理JDKProxy$1
方法執行前操作.......
登錄成功
調用類:JDKProxy$1.java,行數:21
方法執行異常,異常信息:java.lang.ArithmeticException: / by zero
方法執行後操作.......
方法執行後操作.......


至於動態代理用處有很多,比如:全局日誌輸出保存、用戶操作記錄、操作流程等,還有異常信息的捕獲之類的,有興趣可以自行研究

動態代理還有其它方式,比如CGLib這種實現方式,這種方式則對被代理的類沒有要求,無需實現接口


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章