欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

純手寫實現(xiàn)JDK動態(tài)代理-創(chuàng)新互聯(lián)

作者:張豐哲

創(chuàng)新互聯(lián)擁有十載成都網(wǎng)站建設工作經(jīng)驗,為各大企業(yè)提供成都做網(wǎng)站、成都網(wǎng)站制作服務,對于網(wǎng)頁設計、PC網(wǎng)站建設(電腦版網(wǎng)站建設)、成都APP應用開發(fā)、wap網(wǎng)站建設(手機版網(wǎng)站建設)、程序開發(fā)、網(wǎng)站優(yōu)化(SEO優(yōu)化)、微網(wǎng)站、域名申請等,憑借多年來在互聯(lián)網(wǎng)的打拼,我們在互聯(lián)網(wǎng)網(wǎng)站建設行業(yè)積累了很多網(wǎng)站制作、網(wǎng)站設計、網(wǎng)絡營銷經(jīng)驗,集策劃、開發(fā)、設計、營銷、管理等網(wǎng)站化運作于一體,具備承接各種規(guī)模類型的網(wǎng)站建設項目的能力。
原文:https://www.jianshu.com/p/58759fef38b8

前言

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

JDK動態(tài)代理

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

業(yè)務接口:

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

interface

業(yè)務實現(xiàn)類:

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

interface impl

業(yè)務處理類:

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

Handler

測試類:

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

test

運行結果:

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

result

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

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

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

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

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

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

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

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

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

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

$Proxy0

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

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

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

初始化Proxy

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

findObject

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

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

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

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

先來看一眼圖:

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

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

自定義InvocationHandler:

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

MyInvocationHandler

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

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

MyHandler

自定義類加載器MyClassLoader:

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

MyClassLoader

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

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

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

自定義MyProxy:

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

MyProxy

MyProxy的作用就相當于JDK的Proxy。MyProxy做了哪些事情呢?

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

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

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

看一下MyProxy的其他方法:

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

編譯方法

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

getMethodString方法

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

運行結果

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

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

$MyProxy0

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

文章名稱:純手寫實現(xiàn)JDK動態(tài)代理-創(chuàng)新互聯(lián)
分享URL:http://aaarwkj.com/article46/ipjeg.html

成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供用戶體驗、小程序開發(fā)、網(wǎng)頁設計公司、響應式網(wǎng)站、動態(tài)網(wǎng)站商城網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經(jīng)允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)

不卡一区二区三区av电影| 欧美日韩伦理片在线观看| 丰满少妇被激烈的插进去| 久久成人午夜免费电影| 免费欧美一级黄片播放| 久久精品国产亚洲av麻豆网站| 色哟哟精品丝袜一区二区| 男人自拍天堂在线观看| 精品一区二区久久久久久| 欧美一级特黄大片做受另类| 日韩精品 视频二区| 人体艺术日韩色噜噜| 成年女人大片免费观看版| 成人黄片在线免费播放| 亚洲巨大黑人一区二区三区| 99国产综合精品女| 日本一区二区不卡视频在线播放| 中文免费在线观看av| 亚洲国产日韩欧美视频二区| 精品国产一区二区三区大| 精品国产精品中文字幕| 欧美丰满人妻少妇视频在线| av中文字幕在线激情| 亚洲精品一二三区免费| 亚洲av永久精品一区二区三区| 二区三区在线欧美日韩| 中文字幕人妻久久一区| 亚洲欧美一区二区粉嫩| 欧美日韩午夜福利视频| 亚洲一品道在线观看| 亚洲精品网址一区二区| 91欧美精品综合在线| 亚洲av一区二区三区色多多| 啪啪视频日韩一区二区| 日本高清一区二区不卡视频| 国产亚洲精品久久综合阿香| 少妇性生活视频免费观看| 午夜情色视频在线观看| 黄色国产一区二区三区| 成年人免费视频网站国产| 九色综合狠狠综合久久|