首頁 > 書法

張三丰講解Java動態代理

作者:由 計算機java程式設計 發表于 書法日期:2022-07-02

main方法輸出什麼

動態代理的簡要說明

在java的動態代理機制中,有兩個重要的類或介面,一個是 InvocationHandler(Interface)、另一個則是 Proxy(Class)。

一、 InvocationHandler(interface)的描述:

InvocationHandler is the interface implemented by the invocation handler of a proxy instance。

Each proxy instance has an associated invocation handler。 When a method is invoked on a proxy instance, the method invocation is encoded and dispatched to the invoke method of its invocation handler。

每一個動態代理類都必須要實現InvocationHandler這個介面,並且每個代理類的例項都關聯到了一個handler,當我們透過代理物件呼叫 一個方法的時候,這個方法的呼叫就會被轉發為由InvocationHandler這個介面的 invoke 方法來進行呼叫。我們來看看InvocationHandler這個介面的唯一一個方法 invoke 方法:

Object invoke(Object proxy, Method method, Object[] args) throws Throwable

這個方法接收三個引數和返回一個Object型別,它們分別代表的意思如下:

proxy:指代我們所代理的那個真實物件

method:指代的是我們所要呼叫真實物件的方法的Method物件

args:指代的是呼叫真實物件某個方法時接受的引數

返回的Object是指真實物件方法的返回型別,以上會在接下來的例子中加以深入理解。

the value to return from the method invocation on the proxy instance。

二、 Proxy(Class)的描述:

Proxy provides static methods for creating dynamic proxy classes and instances, and it is also the superclass of all dynamic proxy classes created by those methods。

Proxy這個類的作用就是用來動態建立一個代理物件。我們經常使用的是newProxyInstance這個方法:

public static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h) throws IllegalArgumentException

引數的理解:

張三丰講解Java動態代理

返回結果的理解:一個代理物件的例項

a proxy instance with the specified invocation handler of a proxy class that is defined by the specified class loader and that implements the specified interfaces

簡單的Java代理

我們建立一個Java專案用於對動態代理的測試與理解,專案結構如下:

張三丰講解Java動態代理

一、 先定義一個介面Interface,新增兩個方法

張三丰講解Java動態代理

二、 定義一個真實的實現上述介面的類,RealObject:

張三丰講解Java動態代理

三、 定義一個代理物件,也實現了上述的Interface介面:

張三丰講解Java動態代理

四、 SimpleMain在Main方法中,測試上述的結果:

張三丰講解Java動態代理

五、 執行的結果如下:

張三丰講解Java動態代理

Java的動態代理

完成了上述簡單的Java代理,現在我們開始學習Java的動態代理,它比代理的思想更向前一步,因為它可以動態地建立代理並動態的處理對所代理方法的呼叫。

在動態代理上所做的所有呼叫都會被重定向到單一的呼叫處理器上,它的工作是揭示呼叫的型別並確定相應的對策。下面我們透過案例來加深Java動態代理的理解:

一、 建立一個繼承了InvocationHandler的處理器:DynamicProxyHandler

張三丰講解Java動態代理

二、 我們寫一個測試的Main方法,DynamicProxyMain

張三丰講解Java動態代理

三、 執行結果如下:

張三丰講解Java動態代理

從以上輸出結果,我們可以得出以下結論:

與代理物件相關聯的InvocationHandler,只有在代理物件呼叫方法時,才會執行它的invoke方法

invoke的三個引數的理解:Object proxy是代理的物件, Method method是真實物件中呼叫方法的Method類, Object[] args是真實物件中呼叫方法的引數

Java動態代理的原理

一、 動態代理的關鍵程式碼

就是Proxy。newProxyInstance(classLoader, interfaces, handler),我們跟進原始碼看看:

張三丰講解Java動態代理

張三丰講解Java動態代理

二、 我們看一下newInstance方法的原始碼:

張三丰講解Java動態代理

三、 呼叫newInstance()方法

當我們透過代理物件呼叫 一個方法的時候,這個方法的呼叫就會被轉發為由InvocationHandler這個介面的 invoke 方法來進行呼叫。

體現這句話的程式碼,我在原始碼中沒有找到,於是我在測試類的main方法中加入以下程式碼:

張三丰講解Java動態代理

這段程式碼的輸出結果如下,與上述中呼叫代理物件中的getMyName方法輸出是一樣的,不知道Jvm底層是否是這樣判斷的:

張三丰講解Java動態代理

想了解更多精彩內容,快來關注計算機java程式設計