代碼依舊是上篇的那些,唯一改的就是新加的兩個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這種實現方式,這種方式則對被代理的類沒有要求,無需實現接口