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
引數的理解:
返回結果的理解:一個代理物件的例項
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專案用於對動態代理的測試與理解,專案結構如下:
一、 先定義一個介面Interface,新增兩個方法
二、 定義一個真實的實現上述介面的類,RealObject:
三、 定義一個代理物件,也實現了上述的Interface介面:
四、 SimpleMain在Main方法中,測試上述的結果:
五、 執行的結果如下:
Java的動態代理
完成了上述簡單的Java代理,現在我們開始學習Java的動態代理,它比代理的思想更向前一步,因為它可以動態地建立代理並動態的處理對所代理方法的呼叫。
在動態代理上所做的所有呼叫都會被重定向到單一的呼叫處理器上,它的工作是揭示呼叫的型別並確定相應的對策。下面我們透過案例來加深Java動態代理的理解:
一、 建立一個繼承了InvocationHandler的處理器:DynamicProxyHandler
二、 我們寫一個測試的Main方法,DynamicProxyMain
三、 執行結果如下:
從以上輸出結果,我們可以得出以下結論:
與代理物件相關聯的InvocationHandler,只有在代理物件呼叫方法時,才會執行它的invoke方法
invoke的三個引數的理解:Object proxy是代理的物件, Method method是真實物件中呼叫方法的Method類, Object[] args是真實物件中呼叫方法的引數
Java動態代理的原理
一、 動態代理的關鍵程式碼
就是Proxy。newProxyInstance(classLoader, interfaces, handler),我們跟進原始碼看看:
二、 我們看一下newInstance方法的原始碼:
三、 呼叫newInstance()方法
當我們透過代理物件呼叫 一個方法的時候,這個方法的呼叫就會被轉發為由InvocationHandler這個介面的 invoke 方法來進行呼叫。
體現這句話的程式碼,我在原始碼中沒有找到,於是我在測試類的main方法中加入以下程式碼:
這段程式碼的輸出結果如下,與上述中呼叫代理物件中的getMyName方法輸出是一樣的,不知道Jvm底層是否是這樣判斷的:
想了解更多精彩內容,快來關注計算機java程式設計