純手寫實現JDK動態代理
作者:張豐哲
原文:
前言
在Java領域,動態代理應用非常廣泛,特別是流行的Spring/MyBatis等框架。JDK本身是有實現動態代理技術的,不過要求被代理的類必須實現介面,不過cglib對這一不足進行了有效補充。本篇部落格將涉及2個話題:第一,JDK動態代理的實現原理,帶你探索動態代理的實質面目;第二,自己動手寫程式碼去實現JDK動態代理,去創造世界!
JDK動態代理
先寫一個例子,感性認識下動態代理~
業務介面:
interface
業務實現類:
interface impl
業務處理類:
Handler
測試類:
test
執行結果:
result
在JDK動態代理中涉及如下角色:
業務介面Interface、業務實現類target、業務處理類Handler、JVM在記憶體中生成的動態代理類$Proxy0
動態代理原理圖:
動態代理的真實面目
說白了,動態代理的過程是這樣的:
第一:Proxy透過傳遞給它的引數(interfaces/invocationHandler)生成代理類$Proxy0;
第二:Proxy透過傳遞給它的引數(ClassLoader)來載入生成的代理類$Proxy0的位元組碼檔案;
我們來看看上面例子中生成的$Proxy0的模樣:
$Proxy0
首先,$Proxy是實現了我們的業務介面(Man)的,所以客戶端顯然可以呼叫業務介面的方法。
其次,注意到$Proxy是繼承自Proxy,並透過構造方法將業務處理類傳入給父類Proxy進行初始化。(實質上,你可以看看原始碼,在Proxy中存在protected InvocationHandler h;)
初始化Proxy
findObject
很明顯,我們看到了業務介面的方法是如何被呼叫的:
最終都是回撥業務處理類(具體的Handler)的invoke方法完成呼叫!
手寫程式碼實現JDK動態代理
在上面,我們已經分析了JDK動態代理的整個呼叫過程,接下來,我們就來手寫實現它吧!
先來看一眼圖:
手寫實現JDK動態代理
自定義InvocationHandler:
MyInvocationHandler
實現MyInvocationHandler的業務處理Handler:
MyHandler
自定義類載入器MyClassLoader:
MyClassLoader
為什麼要定義一個自定義的類載入器呢?它的作用是什麼呢?
要知道,我們是想手寫JDK動態代理,那麼我們將自己在記憶體中生成動態代理類,那麼我們如何載入呢?這時候,就可以利用自定義的類載入器做到!
上述程式碼,重寫了findClass方法,就是為了在指定路徑下載入指定的位元組碼檔案。
自定義MyProxy:
MyProxy
MyProxy的作用就相當於JDK的Proxy。MyProxy做了哪些事情呢?
第一:需要根據interfaces介面構造出動態代理類需要的方法。(其實就是利用反射獲取)
第二:把動態生成的代理類(即.java檔案)進行編譯,生成位元組碼檔案(即.class檔案),然後利用類載入進行載入
第三:動態代理類進行載入後,利用反射機制,透過構造方法進行例項化,並在例項化時,初始化業務Hanlder
看一下MyProxy的其他方法:
編譯方法
getMethodString方法
執行結果
我們來看一眼生成的$MyProxy0:
$MyProxy0
OK,到這裡,整個JDK的動態代理的實現原理以及手寫實現就結束了,你學到了麼?
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31555484/viewspace-2564674/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 【乾貨】JDK動態代理的實現原理以及如何手寫一個JDK動態代理JDK
- 細說JDK動態代理的實現原理JDK
- JDK 和 CGLib 實現動態代理和區別JDKCGLib
- JDK動態代理JDK
- Java代理(jdk靜態代理、動態代理和cglib動態代理)JavaJDKCGLib
- AOP - 自己寫 JDK 動態代理增強 beanJDKBean
- 基於Apache Zookeeper手寫實現動態配置中心(純程式碼實踐)Apache
- jdk的動態代理和靜態代理你還寫不出來嘛???JDK
- Java動態代理 jdk和cglib的實現比較JavaJDKCGLib
- JDK動態代理實現原理詳解(原始碼分析)JDK原始碼
- JDK動態代理初探JDK
- JDK動態代理和CGLib代理JDKCGLib
- JDK動態代理和 CGLIB 代理JDKCGLib
- 代理模式詳解:靜態代理、JDK動態代理與Cglib動態代理模式JDKCGLib
- Java-JDK動態代理(AOP)使用及實現原理分析JavaJDK
- Spring的JDK動態代理如何實現的(原始碼解析)SpringJDK原始碼
- spring aop原理 JDK動態代理和CGLIB動態代理SpringJDKCGLib
- 深挖JDK動態代理(一)JDK
- JDK動態代理詳解JDK
- 深入理解靜態代理與JDK動態代理JDK
- 靜態代理和動態代理(jdk/cglib)詳解JDKCGLib
- 動手編寫—動態陣列(Java實現)陣列Java
- Java動態代理(JDK和cglib)JavaJDKCGLib
- Spring AOP --JDK動態代理方式SpringJDK
- 你必須會的 JDK 動態代理和 CGLIB 動態代理JDKCGLib
- cglib動態代理和jdk動態代理的區別與應用CGLibJDK
- Java架構-Java JDK 動態代理Java架構JDK
- 【深度思考】聊聊JDK動態代理原理JDK
- 深挖JDK動態代理(二):JDK動態生成後的位元組碼分析JDK
- Spring動態代理的生成-如何判斷是使用JDK動態代理還是CGlib代理SpringJDKCGLib
- 看過Jdk動態代理類長啥樣嗎?Jdk動態代理原理原始碼一本到JDK原始碼
- CGLib動態代理原理及實現CGLib
- RPC核心實現原理-動態代理RPC
- 有點深度的聊聊JDK動態代理JDK
- 基於JDK的動態代理原理分析JDK
- 深入理解JDK動態代理機制JDK
- 動態代理jdk和cglib的區別JDKCGLib
- JDK動態代理物件與被代理物件地址值問題JDK物件