<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Calvin's Tech Space

    成于堅忍,毀于浮躁

       :: 首頁 :: 聯系 :: 聚合  :: 管理

    動態代理的特點是,不要靜態的寫Proxy類,而是在運行時由jdk自己幫助生成類,然后注入到classloader中去。

    代碼:
    public interface BusinessProcess{
              void processBusiness();
    }

    public class BusinessProcessImpl implements BusinessProcess{
              public void processBusiness(){
                    System.out.println("in businessProcessImpl");
               }
    }

    如果要對BusinessProcessImpl增加權限驗證功能,那么靜態代理代碼:
    public class BusinessProcessProxy implements BusinessProcess{
              private BusinessProcess target;
              public BusinessProcessProxy(BusinessProcess target){
                       this.target = target;
              }
              
              public void processBusiness(){
                     checkPermission();
                     this.target.processBusiness();
              }
    }

    對于動態代理:
    public class PermissionHandler implements InvocationHandler {
         private Object target;
         public LoggerHandler(Object target){
            this.target = target;
        }

         public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
            checkPermission();
            Object result = method.invoke(this.target,args);
             return result;
        }
    }

    測試代碼:
            BusinessProcessImpl impl = new BusinessProcessImpl();
            PermissionHandler handler = new PermissionHandler (impl);
            BusinessProcess proxy = (BusinessProcess)Proxy.newProxyInstance(impl.getClass().getClassLoader(),impl.getClass().getInterfaces(), handler);
            proxy.processBusiness();

           注意:
          proxy對象是BusinessProcess接口的一個實現類,但是不是BusinessProcessImpl的子類


    看起來好像靜態代理和動態代理沒什么區別,但是仔細一看,靜態代理代理的target只能是BusinessProcess對象,而動態代理卻能夠代理任何一個Object對象,這就是關鍵區別。所以程序中不需要為每個核心類寫一個Proxy,而公用一個就可以。

    動態代理的實現原理:
    byte[] proxyClassFile = ProxyGenerator.generateProxyClass(proxyName, interfaces);
    proxyClass = defineClass0(loader, proxyName,proxyClassFile, 0,proxyClassFile.length);
    這是java.lang.reflect.Proxy的兩行關鍵代碼,第一行代碼生成名為proxyName, 實現的接口為interfaces的一個類的字節碼。
    第二行代碼,將生成的字節碼注入到classloader中去。

    第一次為某個object生成proxyClass可能比較耗費性能,但是Proxy方法作了緩存,可以彌補這一點。此外,動態代理只能夠對interfaces進行動態的代理, 也就是說它先找出需要代理的對象實現的所有的interface, 然后只對所有的這些interface的所有的方法代理,對象除了interfaces以外的方法不予處理。

    posted on 2009-08-20 12:57 calvin 閱讀(1038) 評論(0)  編輯  收藏 所屬分類: Framework

    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    主站蜘蛛池模板: 国产精品免费福利久久| 成人亚洲国产精品久久| 免费成人高清在线视频| 亚洲人成亚洲人成在线观看| yy一级毛片免费视频| 国产一级淫片视频免费看| 相泽南亚洲一区二区在线播放| 国产成人在线观看免费网站 | 一级a性色生活片久久无少妇一级婬片免费放 | 亚洲成a人片在线观| 18禁美女黄网站色大片免费观看 | 一级特级aaaa毛片免费观看| jizzjizz亚洲| 爱丫爱丫影院在线观看免费 | 亚洲一区二区三区免费视频| 国产成人午夜精品免费视频| 亚洲最大天堂无码精品区| 国产不卡免费视频| 成在人线av无码免费高潮水| 亚洲好看的理论片电影| 永久免费毛片在线播放| 日韩亚洲翔田千里在线| 亚洲中久无码永久在线观看同 | 免费A级毛片无码无遮挡内射| 亚洲乱理伦片在线观看中字| 免费一级毛片在播放视频| 91在线视频免费观看| 亚洲国色天香视频| 免费一级e一片在线播放| 野花香在线视频免费观看大全| 亚洲综合男人的天堂色婷婷| 国产美女无遮挡免费网站| 中文无码日韩欧免费视频| 亚洲国产视频一区| yy6080久久亚洲精品| 色欲国产麻豆一精品一AV一免费| 中文字幕无码精品亚洲资源网久久| 免费中文字幕一级毛片| 日本人的色道免费网站| 美女无遮挡免费视频网站| 国产AⅤ无码专区亚洲AV|