1. 程式人生 > >java 動態代理 自我理解

java 動態代理 自我理解

         在說動態代理前,我們前討論下一般的靜態代理。代理就是為你的物件提供額外的或不同的操作,從而進一步滿足你需要的物件,因此代理通常充當一箇中間人角色。

如果要對第三方提供的JAR包中的某個類中的某個方法的前後加上自己的邏輯,比如打LOG,注意此時我們只有第三方提供的CLASS檔案,因此根本不可能去修改別人的原始碼,那該怎麼辦?這個時候我們就需要代理,有兩種方法可以實現,一種是利用繼承(即讓代理類繼承第三方的類),另一種是利用聚合。

上面這種代理是靜態代理,很受限制,因此我們引入了動態代理。動態代理首先它依然是代理,因此它首先必須具備擴充套件原有操作的能力,基於此,它首先有一個呼叫處理程式(invocation handler)來處理方法的呼叫。呼叫處理程式是一個簡單的類,只需要實現InvocationHandler介面即可。這個接口裡只有一個invoke方法,允許你自己控制整個呼叫過程。其次,代理物件必須知道我代理的是那個類,以及類的實現介面。


        我們要建立一個具有呼叫處理程式的動態代理例項,就須呼叫靜態方法Proxy.newProxyInstance().

這個方法的第一個引數是ClassLoader,負責註冊該代理。第二個引數由該代理需要實現的介面組成,通常需要代理目標類的所有介面。最後一個引數是處理方法呼叫的呼叫處理程式。