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

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

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

    mulinka

    踏實(shí)肯干,不可眼高手低
    posts - 3, comments - 0, trackbacks - 0, articles - 15
      BlogJava :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理
    Java 1.3引入了名為“動(dòng)態(tài)代理類”(Dynamic Proxy Class)的新特性,利用它可為“已知接口的實(shí)現(xiàn)”動(dòng)態(tài)地創(chuàng)建包裝器(wrapper)類。

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

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

    以下內(nèi)容為程序代碼:

     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;
        }
    }


    運(yùn)行效果如下:
    before method bar
    after method bar


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

    以下內(nèi)容為程序代碼:

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

    這樣返回的就是經(jīng)過(guò)代理的對(duì)象了(把原對(duì)象和Handler綁定到一起)

    dynamic proxy的典型應(yīng)用《使用JAVA中的動(dòng)態(tài)代理實(shí)現(xiàn)數(shù)據(jù)庫(kù)連接池》

    dynamic proxy在JDBC上的應(yīng)用
    IBM文章:
    《使用JAVA中的動(dòng)態(tài)代理實(shí)現(xiàn)數(shù)據(jù)庫(kù)連接池》
    主站蜘蛛池模板: 日本黄色动图免费在线观看| 美女被免费网站在线视频免费| 精品在线免费观看| 久久久青草青青国产亚洲免观| 美国免费高清一级毛片| 亚洲精品成人片在线观看| 激情吃奶吻胸免费视频xxxx| 免费在线观看一级毛片| 久久国产精品免费一区| 亚洲av无码潮喷在线观看| 一个人免费日韩不卡视频| 亚洲免费在线视频观看| 免费无码黄动漫在线观看| 性生大片视频免费观看一级| 亚洲日韩国产精品第一页一区| 久久免费观看国产精品| 亚洲av一本岛在线播放| 日本免费人成视频播放 | 岛国av无码免费无禁网站| 亚洲男人天堂2022| 亚洲人妻av伦理| 日韩免费观看一区| 亚洲人成网国产最新在线| 国产成人免费ā片在线观看| 国产免费久久精品99久久| 91亚洲精品第一综合不卡播放| 好男人视频社区精品免费| 四虎永久在线精品免费一区二区| 亚洲av日韩av高潮潮喷无码| 97视频热人人精品免费| 精品免费AV一区二区三区| 国产成人亚洲综合无码精品 | 亚洲视频2020| 成人免费视频88| 国精产品一区一区三区免费视频 | 久久亚洲AV成人无码电影| 女人张开腿给人桶免费视频| 一边摸一边桶一边脱免费视频| 久久久无码精品亚洲日韩蜜臀浪潮 | 今天免费中文字幕视频| 亚洲精品无播放器在线播放|