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

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

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

    mulinka

    踏實肯干,不可眼高手低
    posts - 3, comments - 0, trackbacks - 0, articles - 15
      BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

    Dynamic proxy(動態代理模式)

    Posted on 2005-07-29 11:10 魔之卡卡 閱讀(493) 評論(0)  編輯  收藏 所屬分類: 我的JAVA
    Java 1.3引入了名為“動態代理類”(Dynamic Proxy Class)的新特性,利用它可為“已知接口的實現”動態地創建包裝器(wrapper)類。

    使用動態代理,你創建的包裝器類不要求為所有方法都使用顯式的包裝器,創建的子類也不要求具有嚴格的出身,兩者方法可任選一種你認為最好的。但是,動態代理仍然有一個限制。當你使用動態代理時,要包裝/擴展的對象必須實現一個接口,該接口定義了準備在包裝器中使用的所有方法。這一限制的宗旨是鼓勵良好的設計,而不是為你帶來更多的麻煩。根據經驗,每個類都至少應該實現一個接口(nonconstant接口)。良好的接口用法不僅使動態代理成為可能,還有利于程序的模塊化。

    2種寫invoke()
    注意:必須有return method.invoke(wrapped, args)

    以下內容為程序代碼:

     public Object invoke(Object proxy, Method method, Object[] args)
                throws Throwable {
            Class[] paramTypes = method.getParameterTypes();
            for (int i=0; i < paramTypes.length; i++) {
                if (Tool.class.isAssignableFrom(paramTypes[i])) {
                    args[i] = Tool.RATCHET;
                }
            }
            return method.invoke(wrapped, args);
        }

      public Object invoke(Object proxy, Method m, Object[] args)
               throws Throwable {
           Object result;
           try {
               System.out.println("before method " + m.getName());
               result = m.invoke(obj, args);
           } catch (InvocationTargetException e) {
               throw e.getTargetException();
           } catch (Exception e) {
               throw new RuntimeException("unexpected invocation exception: "
                      + e.getMessage());
           } finally {
               System.out.println("after method " + m.getName());
           }
           return result;
        }
    }


    運行效果如下:
    before method bar
    after method bar


    dynamic proxy的實戰步驟
    實際上dynamic proxy只有關鍵以下幾個東西
    一、業務接口:一個Interface
    二、實現業務接口的類:一個繼承Interface的Class
    三、自己寫一個繼承了java.lang.reflect.InvocationHandler的Handler類
    四、在這個Handler類中實現invoke()方法
    五、在invoke()方法中一定要記得寫return method.invoke(wrapped, args)
    六、要使Handler和自己的業務接口關聯還的寫下面的代碼(一般寫在Handler類中)

    以下內容為程序代碼:

        public static Object newInstance(Object obj) {
           return java.lang.reflect.Proxy.newProxyInstance(obj.getClass()
                  .getClassLoader(), obj.getClass().getInterfaces(),new Handler(obj));
        }

    這樣返回的就是經過代理的對象了(把原對象和Handler綁定到一起)

    dynamic proxy的典型應用《使用JAVA中的動態代理實現數據庫連接池》

    dynamic proxy在JDBC上的應用
    IBM文章:
    《使用JAVA中的動態代理實現數據庫連接池》
    主站蜘蛛池模板: 国产在线观看片a免费观看 | 亚洲丁香色婷婷综合欲色啪| 亚洲精品无码成人片久久| 91情国产l精品国产亚洲区| 亚洲国产成AV人天堂无码| 日韩国产精品亚洲а∨天堂免| 深夜久久AAAAA级毛片免费看| 久久国产乱子伦精品免费强| 最近的中文字幕大全免费版| 国产精品亚洲不卡一区二区三区| 亚洲国产精久久久久久久| 亚洲欧洲无码一区二区三区| XXX2高清在线观看免费视频| 国产成人免费在线| 精品国产污污免费网站aⅴ| 无码专区—VA亚洲V天堂| 91热久久免费精品99| 超清首页国产亚洲丝袜| 亚洲中文字幕乱码一区| 免费人成在线观看网站| 亚洲精品美女在线观看播放| 一个人看的www在线免费视频| 日本zzzzwww大片免费| 亚洲人成色777777老人头| 免费国产在线观看| 亚洲中文字幕无码中文| 欧洲精品免费一区二区三区| 亚洲最大在线视频| 中国精品一级毛片免费播放| 免费人成视频x8x8入口| 中文字幕免费在线看| 91大神亚洲影视在线| 国产在线19禁免费观看| 亚洲人成免费网站| 国产成人免费永久播放视频平台| 一级毛片在线完整免费观看| 久久精品国产亚洲AV香蕉| 久操视频免费观看| 亚洲精品亚洲人成人网| 免费国产作爱视频网站| 免费手机在线看片|