動態代理可以使代理模式更加靈活,面試被問到率高達90%

Java的反射框架提供了動態代理(Dynamic Proxy)機制,允許在運行期對目標類生成代理,避免重複開發。我們知道一個靜態代理是通過主題角色(Proxy)和具體主題角色(Real Subject)共同實現主題角色(Subject)的邏輯的,只是代理角色把相關的執行邏輯委託給了具體角色而已,一個簡單的靜態代理如下所示:

動態代理可以使代理模式更加靈活,面試被問到率高達90%

這是一個簡單的靜態代理。Java還提供了java.lang.reflect.Proxy用於實現動態代理:只要提供一個抽象主題角色和具體主題角色,就可以動態實現其邏輯的,其實例代碼如下:

動態代理可以使代理模式更加靈活,面試被問到率高達90%

注意這裡沒有代理主題角色,取而代之的是SubjectHandler 作為主要的邏輯委託處理,其中invoke方法是接口InvocationHandler定義必須實現的,它完成了對真實方法的調用。

我們來詳細解釋一下InvocationHandler接口,動態代理是根據被代理的接口生成的所有方法的,也就是說給定一個或多個接口,動態代理會宣稱“我已經實現該接口下的所有方法了”,那大家想想看,動態代理是怎麼才能實現接口中的方法呢?在默認情況下所有方法的返回值都是空的,是的,雖然代理已經實現了它,但是沒有任何的邏輯含義,那怎麼辦?好辦,通過InvocationHandler接口的實現類來實現,所有的方法都是由該Handler進行處理的,即所有被代理的方法都由InvocationHandler接管實際的處理任務。

我們開看看動態代理的場景,代碼如下:

動態代理可以使代理模式更加靈活,面試被問到率高達90%

此時就實現了,不用顯式創建代理類即實現代理的功能,例如可以在被代理的角色執行前進行權限判斷,或者執行後進行數據校驗。

動態代理很容易實現通用的代理類,只要在InvocationHandler的invoke方法中讀取持久化的數據即可實現,而且還能實現動態切入的效果,這也是AOP(Aspect Oriented Programming)變成理念。

有討論,才有進步,大家各抒己見,讓每位同學學到不一樣的!


分享到:


相關文章: