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

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

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

    Calvin's Tech Space

    成于堅忍,毀于浮躁

       :: 首頁 :: 聯(lián)系 :: 聚合  :: 管理

    動態(tài)代理的特點(diǎn)是,不要靜態(tài)的寫Proxy類,而是在運(yùn)行時由jdk自己幫助生成類,然后注入到classloader中去。

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

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

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

    對于動態(tài)代理:
    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接口的一個實(shí)現(xiàn)類,但是不是BusinessProcessImpl的子類


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

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

    第一次為某個object生成proxyClass可能比較耗費(fèi)性能,但是Proxy方法作了緩存,可以彌補(bǔ)這一點(diǎn)。此外,動態(tài)代理只能夠?qū)nterfaces進(jìn)行動態(tài)的代理, 也就是說它先找出需要代理的對象實(shí)現(xiàn)的所有的interface, 然后只對所有的這些interface的所有的方法代理,對象除了interfaces以外的方法不予處理。

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

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


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 亚洲制服在线观看| 久久久亚洲欧洲日产国码是AV | 中文字幕看片在线a免费| 国产一区视频在线免费观看| 亚洲精华液一二三产区| 国产老女人精品免费视频| 亚洲国产成人精品无码区二本| 夭天干天天做天天免费看| 亚洲国产精品久久久久秋霞小| 在线观看无码的免费网站| 国产成人亚洲毛片| 高清在线亚洲精品国产二区| 免费又黄又爽又猛大片午夜 | 亚洲一级特黄特黄的大片| 18禁成年无码免费网站无遮挡| 亚洲最大的黄色网| 国产麻豆免费观看91| 高潮毛片无遮挡高清免费视频| jlzzjlzz亚洲乱熟在线播放| 免费国产成人18在线观看| 亚洲日韩中文字幕天堂不卡 | 亚洲Av无码乱码在线播放| 中国一级毛片免费看视频| 亚洲电影一区二区三区| 国产成人午夜精品免费视频| 亚洲成av人无码亚洲成av人| 亚洲国产精品13p| 免费无码中文字幕A级毛片| 亚洲乱码在线播放| 区三区激情福利综合中文字幕在线一区亚洲视频1 | 亚洲黄色免费观看| 亚洲国产成人久久综合| 亚洲日韩国产成网在线观看| 久久aⅴ免费观看| 亚洲欧美日韩一区二区三区| 久久亚洲色一区二区三区| 亚欧色视频在线观看免费| 色www免费视频| 亚洲日产2021三区| 亚洲AV无码成人精品区大在线| 久久一区二区三区免费播放|