<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

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


    網站導航:
     
    主站蜘蛛池模板: 在线观看亚洲人成网站| 最近免费字幕中文大全| 亚洲日韩图片专区第1页| 国产又黄又爽又猛的免费视频播放| 免费看少妇高潮成人片| 精品免费AV一区二区三区| 亚洲酒色1314狠狠做| 亚洲人成人网站色www | 亚洲欧洲日产专区| 中文字幕亚洲第一| 国产无遮挡吃胸膜奶免费看| 99久久免费国产香蕉麻豆| 免费精品一区二区三区第35| 人人公开免费超级碰碰碰视频| 国产91在线|亚洲| 亚洲视频小说图片| 亚洲av无码专区国产乱码在线观看| 又黄又大又爽免费视频| 好爽…又高潮了免费毛片 | 亚洲视频在线免费播放| 亚洲日韩欧洲乱码AV夜夜摸| 亚洲电影日韩精品| 波多野结衣免费视频观看| 四虎成人免费大片在线| 女人18毛片特级一级免费视频 | 亚洲欧洲国产视频| 亚洲av成人无码久久精品| 亚洲精品无码不卡在线播HE | 亚洲爆乳无码专区www| 亚洲自国产拍揄拍| 亚洲人成在线播放| 亚洲丰满熟女一区二区v| 亚洲精品视频在线观看视频| 久久精品国产亚洲精品2020| 337p欧洲亚洲大胆艺术| 亚洲国产精品久久丫| 亚洲人成黄网在线观看 | 日本免费一区二区三区最新vr| 女人被弄到高潮的免费视频| 成人人免费夜夜视频观看| 全免费a级毛片免费看无码|