Java的反射框架提供了動態代理(Dynamic Proxy)機制,允許在運行期對目標類生成代理,避免重複開發。我們知道一個靜態代理是通過主題角色(Proxy)和具體主題角色(Real Subject)共同實現主題角色(Subject)的邏輯的,只是代理角色把相關的執行邏輯委託給了具體角色而已,一個簡單的靜態代理如下所示:
這是一個簡單的靜態代理。Java還提供了java.lang.reflect.Proxy用於實現動態代理:只要提供一個抽象主題角色和具體主題角色,就可以動態實現其邏輯的,其實例代碼如下:
注意這裡沒有代理主題角色,取而代之的是SubjectHandler 作為主要的邏輯委託處理,其中invoke方法是接口InvocationHandler定義必須實現的,它完成了對真實方法的調用。
我們來詳細解釋一下InvocationHandler接口,動態代理是根據被代理的接口生成的所有方法的,也就是說給定一個或多個接口,動態代理會宣稱“我已經實現該接口下的所有方法了”,那大家想想看,動態代理是怎麼才能實現接口中的方法呢?在默認情況下所有方法的返回值都是空的,是的,雖然代理已經實現了它,但是沒有任何的邏輯含義,那怎麼辦?好辦,通過InvocationHandler接口的實現類來實現,所有的方法都是由該Handler進行處理的,即所有被代理的方法都由InvocationHandler接管實際的處理任務。
我們開看看動態代理的場景,代碼如下:
此時就實現了,不用顯式創建代理類即實現代理的功能,例如可以在被代理的角色執行前進行權限判斷,或者執行後進行數據校驗。
動態代理很容易實現通用的代理類,只要在InvocationHandler的invoke方法中讀取持久化的數據即可實現,而且還能實現動態切入的效果,這也是AOP(Aspect Oriented Programming)變成理念。
有討論,才有進步,大家各抒己見,讓每位同學學到不一樣的!
閱讀更多 Free碼農 的文章