在介紹動态代理之前,我們先來看看靜态代理的實作過程,代理我們可以了解為為其他對象提供一種代理以控制對這個對象的通路。
首先我們建立一個接口:
接下來,我們建立一個實作類:
我們現在要對<code>dog</code>類進行代理,是以需要建立代理類:
下面我們用一個測試類測試一下:
運作結果:
before invoke sleep…
dog sleep…
after invoke sleep…
before invoke run…
dog run…
after invoke run…
靜态代理存在大量的重複代碼且需要維護多個代理類,維護成本很大,是以使用動态代理是很有必要的。
動态代理需要用到<code>java.lang.reflect.invocationhandler</code>和<code>java.lang.reflect.proxy</code>。
invocationhandler是代理執行個體的調用處理程式 實作的接口。proxy提供用于建立動态代理類和執行個體的靜态方法,它還是由這些方法建立的所有動态代理類的超類。
同樣的我們還是以靜态代理中的例子來示範動态代理的使用,實作同樣的功能,我們可以編寫一個類實作<code>invocationhandler</code>接口:
最後,我們編寫一個測試類測試一下:
通過對比動态代理與靜态代理的實作方式,我們可以發現動态代理更加簡潔,更易于維護。
我們可以将動态代理的相關實作提取出來,形成工具類,友善以後使用:
我們可以這樣使用工具類
before invoke sleep
after invoke sleep
before invoke run
after invoke run
如果我們想代理指定的方法,我們可以這樣去寫: