純手寫實現JDK動態代理

純手寫實現JDK動態代理

前言

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

JDK動態代理

先寫一個例子,感性認識下動態代理~

業務接口:

純手寫實現JDK動態代理

interface

業務實現類:

純手寫實現JDK動態代理

interface impl

業務處理類:

純手寫實現JDK動態代理

Handler

測試類:

純手寫實現JDK動態代理

test

運行結果:

純手寫實現JDK動態代理

result

在JDK動態代理中涉及如下角色:

業務接口Interface、業務實現類target、業務處理類Handler、JVM在內存中生成的動態代理類$Proxy0

動態代理原理圖:

純手寫實現JDK動態代理

動態代理的真實面目

說白了,動態代理的過程是這樣的:

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

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

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

純手寫實現JDK動態代理

$Proxy0

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

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

純手寫實現JDK動態代理

初始化Proxy

純手寫實現JDK動態代理

findObject

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

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

手寫代碼實現JDK動態代理

在上面,我們已經分析了JDK動態代理的整個調用過程,接下來,我們就來手寫實現它吧!

先來看一眼圖:

純手寫實現JDK動態代理

手寫實現JDK動態代理

自定義InvocationHandler:

純手寫實現JDK動態代理

MyInvocationHandler

實現MyInvocationHandler的業務處理Handler:

純手寫實現JDK動態代理

MyHandler

自定義類加載器MyClassLoader:

純手寫實現JDK動態代理

MyClassLoader

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

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

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

自定義MyProxy:

純手寫實現JDK動態代理

MyProxy

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

第一:需要根據interfaces接口構造出動態代理類需要的方法。(其實就是利用反射獲取)

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

第三:動態代理類進行加載後,利用反射機制,通過構造方法進行實例化,並在實例化時,初始化業務Hanlder

看一下MyProxy的其他方法:

純手寫實現JDK動態代理

編譯方法

純手寫實現JDK動態代理

getMethodString方法

純手寫實現JDK動態代理

運行結果

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

純手寫實現JDK動態代理

$MyProxy0

OK,到這裡,整個JDK的動態代理的實現原理以及手寫實現就結束了,你學到了麼?

GoodBye My Friend~

純手寫實現JDK動態代理

本號已開設如下二十大專題,歡迎關注查看相關專題!

  • 【springboot專題】【spring源碼】
  • 【mysql優化專題】【HTTP協議】
  • 【架構技術專題】【多線程專題】
  • 【dubbo專題】【dubbo源碼專題】
  • 【JVM調優專題】【HTTP專題】
  • 【設計模式專題】【高併發專題】
  • 【架構技術專題】【Lucene專題】
  • 【數據結構專題】【redis專題】
  • 【mq中間件專題】【netty專題】
  • 【java面試專題】【zookeeper】

悶騷的大屌程序員富一代們↓↓↓↓


分享到:


相關文章: