標籤:sof 繼承 概念 公眾號 第一個 idt 方法 super 處理
轉自這個公眾號:
今天會聊一下InvocationHandler。說到InvocationHandler不得不提到的就是代理模式,什麼是代理模式,舉個例子,你玩遊戲,花錢請個代練,代練其實是登入你的帳號,假裝是你幫你升級打怪。再比如買房,你需要委託中介幫你去處理一些事,中介在辦理這些事的時候,實際是使用你的身份證,身份資訊去辦理的。
代理模式也是一樣,比如有一個類,有一個方法是壓縮圖片的。現在你突然需要,在這個方法之前去做一些操作,比如就是打個log吧,壓縮之後再打個log。
可能你會想,那直接改這個方法不就完事了,是的,可以,但是也許要在某些地方調用這個類的方法時候,不需要列印Log。
你又說了,那就再寫一個類。當然,也可以,但是你想想,壓縮圖片的代碼是一樣的,那你以後豈不是要維護兩套一樣的代碼,不行不行,太費勁了。
這時你可能還不死心,那用繼承吧,繼承原有類,重寫這個壓縮方法,super前列印一個log,super後列印一個log。嗯嗯,這個是可行的,但是可能這個類中其它的方法我都用不到,我只用這個壓縮方法,繼承豈不是太重了。
那還有什麼辦法呢?
這時候就可以用到代理模式。來,一起看一個例子吧。
我有一個介面:
沒毛病吧,還有個實作類別:
也沒毛病吧,直接執行個體化了就能用。
如果我想在之前之後加點東西怎麼辦?
兩個方式:
靜態代理
在寫一個類:
這時候在調用:
看一下結果:
動態代理
另外一種就是動態代理了,可以直接使用JDK的動態代理模式(hook中用的比較多,之後的文章會說到)。
動態代理,需要用到反射的概念,關於反射,可以參考我之前的文章(我會附在最下面)。
首先我們不需要去實現這個介面了。只需要去實現Java中的一個介面InvocationHandler
然後利用Proxy類進行執行個體化:
來一下效果:
簡而言之
Proxy是一個方法攔截器,第一個參數是ClassLoader,第二個參數是攔截的類,InvocationHandler就是攔截的介面,在InvocationHandler中可以重新實現這個方法。
(轉 )【Android那些高逼格的寫法】InvocationHandler與代理模式