Java的動態代理機制

       第一篇blog文章,自己是個菜鳥,希望大家能有指出文章中的錯誤,大家一起進步。

 

上圖是代理模式的實現,代理模式主要是用於客戶端對真實對象訪問之前進行一些控制,例如日誌輸出,權限控制等,如上圖,客戶程序只能通過SubjectProxy來訪問RealSubject,因爲代理類和實現類都是實現一個同一個Subject接口,所以在客戶程序看來,他只知道訪問的是實現Subject接口的一個對象,而不管是哪個類的對象,代理類持有被代理對象的引用,在調用方法時,代理對象可以先做一些操作,然後再調用被代理對象的方法。但是這樣做的缺點是,一個Subject就要創建一個代理類,如果Subject很多,那麼就需要爲每個Subject都創建一個代理類,類的數量就會變得很龐大,更重要的是,如果要修改代理功能,比如原來是沒有日誌輸出的,現在要加上日誌輸出,哪麼你需要在每個代理類中添加日誌輸出的代碼,(不過要是權限控制的話,這樣的靜態代理是不是能實現更細粒度的權限控制?比如我對這個對象的方法可以讓所有人訪問,而其他一個對象需要有某某權限才能訪問。如果在動態代理下,也可以實現對每個對象的細粒度控制,不過那樣動態代理類應該會非常龐大了吧?),

 

    在Java中,還有一種動態代理,他可以解決上面當Subject很多的時候,每個代理都要生成一個代理類的問題,其主要用到了java.lang.reflect包下的ProxyInvocationHandler.

首先我們讓一個Handler類實現InvocationHandler接口,然後用ProxyProxy.newProxyInstance(loader, interfaces, h)方法生成一個動態代理對象,其中的三個參數分別爲:第一個制類的裝載器,第二個是要生成的動態代理類的接口,第三個是實現了InvocationHandler接口的Handler類,當調用生成出來的動態代理對象的方法時,他就自動去調用HandlerinvokeInvocationHandler接口要求必須實現invoke方法)這樣就實現了動態代理,即使有很多類,也只要一個代理即可。

 

 

        還有兩個不太明白的地方就是invoke方法裏的第一個參數,proxy,應該就是動態代理對象,但是他傳到invoke裏面做什麼呢?因爲在invoke裏再調用他肯定會形成死循環,估計是不是invoke方法調用的時候要用到proxy這個對象,但是如果我們是用不到這個對象的,sun爲什麼還寫在這裏呢?不能把它隱藏起來麼?還有就是上面我說的細粒度的權限控制問題,如果幾個對象的權限訪問機制都不一樣,哪麼就必須得在invoke中來處理,這樣的話,invoke方法將非常龐大,希望各位高手能指點下哈,本人第一次寫blog,感覺自己的表達能力真的是很差,寫這麼一篇文章就花了1個多小時,呵呵,以後只能多加練習了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章