- Spring Boot進階:原理、實戰與面試題分析
- 鄭天民
- 498字
- 2022-07-05 09:41:48
3.2.1 JDK動態代理
在JDK自帶的動態代理中存在一個InvocationHandler接口,我們首先要做的就是提供一個該接口的實現類,如代碼清單3-7所示。
代碼清單3-7 InvocationHandler接口實現類代碼
public class AccountHandler implements InvocationHandler{ private Object obj; public AccountHandler(Object obj) { super(); this.obj = obj; } @Override public Object invoke(Object proxy, Method method, Object[] arg) throws Throwable { Object result = null; doBefore(); result = method.invoke(obj, arg); doAfter(); return result; } public void doBefore() { System.out.println("開戶前"); } public void doAfter() { System.out.println("開戶后"); } }
InvocationHandler接口中包含一個invoke()方法,我們必須實現這一方法。在該方法中,通常需要調用method.invoke()方法執行原有對象的代碼邏輯,然后可以在該方法前后添加相應的代理實現。在上述代碼中,我們只是簡單打印了日志。
然后,編寫測試類來驗證上述AccountHandler類的執行效果,如代碼清單3-8所示。
代碼清單3-8 AccountHandler測試類代碼
public class AccountTest { public static void main(String[] args) { Account account = new RealAccount("tianyalan"); InvocationHandler handler = new AccountHandler(account); Account proxy = (Account)Proxy.newProxyInstance( account.getClass().getClassLoader(), account.getClass().getInterfaces(), handler); proxy.open(); } }
這里的Proxy.newProxyInstance()方法的作用就是生成代理類。當該方法被調用時,RealAccount類的實例被傳入。然后當代理類的open()方法被調用時,AccountHandler中invoke()方法就會被觸發,從而實現代理機制。這里的類層次結構如圖3-4所示。

圖3-4 JDK動態代理類層次結構示意圖
仔細分析上述代碼結構,可以發現其遵循“設計并實現業務接口→實現Handler→創建代理類”這一流程,然后在Handler中構建具體的代理邏輯。上述流程也是代表了基本的代理機制實現流程。聯想一下,很多基于AOP機制的攔截器底層實際上就是類似的原理。
推薦閱讀
- Puppet 4 Essentials(Second Edition)
- 軟件項目估算
- 程序員面試白皮書
- OpenDaylight Cookbook
- Linux C/C++服務器開發實踐
- Learn to Create WordPress Themes by Building 5 Projects
- Vue.js前端開發基礎與項目實戰
- R語言游戲數據分析與挖掘
- Learning Laravel 4 Application Development
- Python高效開發實戰:Django、Tornado、Flask、Twisted(第3版)
- Reactive Programming With Java 9
- Mastering Rust
- JavaScript 程序設計案例教程
- 精通Linux(第2版)
- Machine Learning for Developers