Java代理系列-動態代理熱身

上一章學習了Java的靜態代理,可是咱們主要用的是動態代理,在學習動態代理前,先熟悉一下須要的APIjava

InvocationHandler數組

Proxyide

Method學習

InvocationHandler是使用Java動態代理必須實現(implements)的接口,它只有一個方法invoke
測試

可能使用過java反射的朋友們都見過此方法,它是用來調用最終的方法的。this

下面貼出Java JDK文檔對此方法的詳細解釋spa

invoke代理


Object invoke(Object proxy, Method method, Object[] args)code

              throws Throwable對象

在代理實例上處理方法調用並返回結果。在與方法關聯的代理實例上調用方法時,將在調用處理程序上調用此方法。

參數:

proxy - 在其上調用方法的代理實例

method - 對應於在代理實例上調用的接口方法的 Method 實例。Method 對象的聲明類將是在其中聲明方法的接口,該接口能夠是代理類賴以繼承方法的代理接口的超接口。

args - 包含傳入代理實例上方法調用的參數值的對象數組,若是接口方法不使用參數,則爲 null。基本類型的參數被包裝在適當基本包裝器類(如 java.lang.Integer 或 java.lang.Boolean)的實例中。

返回:

從代理實例的方法調用返回的值。若是接口方法的聲明返回類型是基本類型,則此方法返回的值必定是相應基本包裝對象類的實例;不然,它必定是可分配到聲明返回類型的類型。若是此方法返回的值爲 null 而且接口方法的返回類型是基本類型,則代理實例上的方法調用將拋出 NullPointerException。不然,若是此方法返回的值與上述接口方法的聲明返回類型不兼容,則代理實例上的方法調用將拋出 ClassCastException。

拋出:

Throwable - 從代理實例上的方法調用拋出的異常。該異常的類型必須能夠分配到在接口方法的 throws 子句中聲明的任一異常類型或未經檢查的異常類型 java.lang.RuntimeException 或 java.lang.Error。若是此方法拋出通過檢查的異常,該異常不可分配到在接口方法的 throws 子句中聲明的任一異常類型,代理實例的方法調用將拋出包含此方法曾拋出的異常的 UndeclaredThrowableException。

另請參見:

UndeclaredThrowableException


proxy:要調用方法的接口實現類的實例,好比說上一章的new HelloInterfaceImpl(),它是一個實例對象。

method:你要調用的方法名,必須是HelloInterfaceImpl中有的方法,好比say,你要寫個eat,那確定出錯了。

args[]:調用的方法的參數數組

method和args[]參數都不想要本身擴展,只需默認就行。

可是proxy是須要本身注入實現的,其實就是獲得它的代理對象實例。

實際調用時,好比這樣

//代碼不能用,主要看mothod.invoke(proxy, args)
@Override
public Object invoke(Object proxy, Method method, Object[] args)  
            throws Throwable {  
        method.invoke(proxy, args);  
    }

這裏還要用到Method代理類,它是用來最後的方法調用,下面是Method接口的invoke方法API

 Object invoke(Object obj, Object... args) 
          對帶有指定參數的指定對象調用由此 Method 對象表示的底層方法。

從上能夠看出,咱們仍是隻須要獲得obj的實例便可,它會返回一個對象。

關於如何進行方法調用呢就寫完了,下面看如何獲得proxy的實例,這就要使用Proxy接口了,看官方API怎麼解釋

Proxy 提供用於建立動態代理類和實例的靜態方法,它仍是由這些方法建立的全部動態代理類的超類。

它的意思就是說我提供一個靜態方法,這個靜態方法會產生一個proxy實例。下面是這個方法官方API接口解釋

static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h) 
          返回一個指定接口的代理類實例,該接口能夠將方法調用指派到指定的調用處理程序。

loader:加載一個要綁定的具體實現類的class

interface:上面的class實現的接口

h:上面的InvocationHandler自己的對象,由於咱們要在實現了InvocationHandler 類裏獲得自己的對象,用this便可,也有其餘寫法,好比要在測試類裏寫newProxyInstance方法,那麼咱們就要把實現類上轉型成InvocationHandler對象傳進去。這個方法返回的是一個接口,就是實現類implements的那個接口。

瞭解完這些了呢,下一章該寫Java動態代理了。

才疏學淺,若有錯誤敬請指出,謝謝。

相關文章
相關標籤/搜索