<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 閱讀(1042) 評論(0)  編輯  收藏 所屬分類: Framework

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


    網站導航:
    博客園   IT新聞   Chat2DB   C++博客   博問  
     
    主站蜘蛛池模板: 人妻仑乱A级毛片免费看| 国产亚洲精品成人AA片| 波多野结衣中文一区二区免费| 亚洲白色白色永久观看| 222www免费视频| 亚洲黄色在线网站| 24小时在线免费视频| 亚洲国产精品综合福利专区| ww在线观视频免费观看| 亚洲人成影院在线无码观看| 亚洲第一页在线视频| 精品福利一区二区三区免费视频| 亚洲日本香蕉视频| 成人在线免费观看| 国产AV无码专区亚洲AV琪琪| 亚洲第一页综合图片自拍| caoporn国产精品免费| 免费观看大片毛片| 国产亚洲综合精品一区二区三区| 亚洲毛片av日韩av无码| 亚洲日本成本人观看| 国产免费私拍一区二区三区| 人妻免费久久久久久久了| 亚洲ⅴ国产v天堂a无码二区| 欧洲一级毛片免费| 女bbbbxxxx另类亚洲| 免费无码黄十八禁网站在线观看| 亚洲一区二区三区成人网站| 免费一级e一片在线播放| 毛片基地看看成人免费| 亚洲伊人成无码综合网 | 久久WWW色情成人免费观看| 最新亚洲人成无码网www电影| 亚洲午夜福利精品久久| 98精品全国免费观看视频| 亚洲日本成本人观看| 亚洲AV无码一区二区三区DV| 国产精品无码免费专区午夜| 中文字幕亚洲色图| 亚洲精品和日本精品| 国产h肉在线视频免费观看|