真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

純手寫實(shí)現(xiàn)JDK動態(tài)代理

作者:張豐哲

創(chuàng)新互聯(lián)建站服務(wù)項(xiàng)目包括會寧網(wǎng)站建設(shè)、會寧網(wǎng)站制作、會寧網(wǎng)頁制作以及會寧網(wǎng)絡(luò)營銷策劃等。多年來,我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢、行業(yè)經(jīng)驗(yàn)、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機(jī)構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,會寧網(wǎng)站推廣取得了明顯的社會效益與經(jīng)濟(jì)效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到會寧省份的部分城市,未來相信會繼續(xù)擴(kuò)大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!

原文:https://www.jianshu.com/p/58759fef38b8

前言

在Java領(lǐng)域,動態(tài)代理應(yīng)用非常廣泛,特別是流行的Spring/MyBatis等框架。JDK本身是有實(shí)現(xiàn)動態(tài)代理技術(shù)的,不過要求被代理的類必須實(shí)現(xiàn)接口,不過cglib對這一不足進(jìn)行了有效補(bǔ)充。本篇博客將涉及2個話題:第一,JDK動態(tài)代理的實(shí)現(xiàn)原理,帶你探索動態(tài)代理的實(shí)質(zhì)面目;第二,自己動手寫代碼去實(shí)現(xiàn)JDK動態(tài)代理,去創(chuàng)造世界!

JDK動態(tài)代理

先寫一個例子,感性認(rèn)識下動態(tài)代理~

業(yè)務(wù)接口:

純手寫實(shí)現(xiàn)JDK動態(tài)代理

interface

業(yè)務(wù)實(shí)現(xiàn)類:

純手寫實(shí)現(xiàn)JDK動態(tài)代理

interface impl

業(yè)務(wù)處理類:

純手寫實(shí)現(xiàn)JDK動態(tài)代理

Handler

測試類:

純手寫實(shí)現(xiàn)JDK動態(tài)代理

test

運(yùn)行結(jié)果:

純手寫實(shí)現(xiàn)JDK動態(tài)代理

result

在JDK動態(tài)代理中涉及如下角色:

業(yè)務(wù)接口Interface、業(yè)務(wù)實(shí)現(xiàn)類target、業(yè)務(wù)處理類Handler、JVM在內(nèi)存中生成的動態(tài)代理類$Proxy0

動態(tài)代理原理圖:

純手寫實(shí)現(xiàn)JDK動態(tài)代理

動態(tài)代理的真實(shí)面目

說白了,動態(tài)代理的過程是這樣的:

第一:Proxy通過傳遞給它的參數(shù)(interfaces/invocationHandler)生成代理類$Proxy0;

第二:Proxy通過傳遞給它的參數(shù)(ClassLoader)來加載生成的代理類$Proxy0的字節(jié)碼文件;

我們來看看上面例子中生成的$Proxy0的模樣:

純手寫實(shí)現(xiàn)JDK動態(tài)代理

$Proxy0

首先,$Proxy是實(shí)現(xiàn)了我們的業(yè)務(wù)接口(Man)的,所以客戶端顯然可以調(diào)用業(yè)務(wù)接口的方法。

其次,注意到$Proxy是繼承自Proxy,并通過構(gòu)造方法將業(yè)務(wù)處理類傳入給父類Proxy進(jìn)行初始化。(實(shí)質(zhì)上,你可以看看源碼,在Proxy中存在protected InvocationHandler h;)

純手寫實(shí)現(xiàn)JDK動態(tài)代理

初始化Proxy

純手寫實(shí)現(xiàn)JDK動態(tài)代理

findObject

很明顯,我們看到了業(yè)務(wù)接口的方法是如何被調(diào)用的:

最終都是回調(diào)業(yè)務(wù)處理類(具體的Handler)的invoke方法完成調(diào)用!

手寫代碼實(shí)現(xiàn)JDK動態(tài)代理

在上面,我們已經(jīng)分析了JDK動態(tài)代理的整個調(diào)用過程,接下來,我們就來手寫實(shí)現(xiàn)它吧!

先來看一眼圖:

純手寫實(shí)現(xiàn)JDK動態(tài)代理

手寫實(shí)現(xiàn)JDK動態(tài)代理

自定義InvocationHandler:

純手寫實(shí)現(xiàn)JDK動態(tài)代理

MyInvocationHandler

實(shí)現(xiàn)MyInvocationHandler的業(yè)務(wù)處理Handler:

純手寫實(shí)現(xiàn)JDK動態(tài)代理

MyHandler

自定義類加載器MyClassLoader:

純手寫實(shí)現(xiàn)JDK動態(tài)代理

MyClassLoader

為什么要定義一個自定義的類加載器呢?它的作用是什么呢?

要知道,我們是想手寫JDK動態(tài)代理,那么我們將自己在內(nèi)存中生成動態(tài)代理類,那么我們?nèi)绾渭虞d呢?這時候,就可以利用自定義的類加載器做到!

上述代碼,重寫了findClass方法,就是為了在指定路徑下加載指定的字節(jié)碼文件。

自定義MyProxy:

純手寫實(shí)現(xiàn)JDK動態(tài)代理

MyProxy

MyProxy的作用就相當(dāng)于JDK的Proxy。MyProxy做了哪些事情呢?

第一:需要根據(jù)interfaces接口構(gòu)造出動態(tài)代理類需要的方法。(其實(shí)就是利用反射獲?。?/strong>

第二:把動態(tài)生成的代理類(即.java文件)進(jìn)行編譯,生成字節(jié)碼文件(即.class文件),然后利用類加載進(jìn)行加載

第三:動態(tài)代理類進(jìn)行加載后,利用反射機(jī)制,通過構(gòu)造方法進(jìn)行實(shí)例化,并在實(shí)例化時,初始化業(yè)務(wù)Hanlder

看一下MyProxy的其他方法:

純手寫實(shí)現(xiàn)JDK動態(tài)代理

編譯方法

純手寫實(shí)現(xiàn)JDK動態(tài)代理

getMethodString方法

純手寫實(shí)現(xiàn)JDK動態(tài)代理

運(yùn)行結(jié)果

我們來看一眼生成的$MyProxy0:

純手寫實(shí)現(xiàn)JDK動態(tài)代理

$MyProxy0

OK,到這里,整個JDK的動態(tài)代理的實(shí)現(xiàn)原理以及手寫實(shí)現(xiàn)就結(jié)束了,你學(xué)到了么?


標(biāo)題名稱:純手寫實(shí)現(xiàn)JDK動態(tài)代理
轉(zhuǎn)載源于:http://weahome.cn/article/pdcocc.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部