mulinka

          踏實(shí)肯干,不可眼高手低
          posts - 3, comments - 0, trackbacks - 0, articles - 15
            BlogJava :: 首頁 :: 新隨筆 :: 聯(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ì),而不是為你帶來更多的麻煩。根據(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)過代理的對(duì)象了(把原對(duì)象和Handler綁定到一起)

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

          dynamic proxy在JDBC上的應(yīng)用
          IBM文章:
          《使用JAVA中的動(dòng)態(tài)代理實(shí)現(xiàn)數(shù)據(jù)庫連接池》

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


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 会同县| 南靖县| 原阳县| 永年县| 舒城县| 太仆寺旗| 巫山县| 池州市| 灵璧县| 凤城市| 潍坊市| 濉溪县| 宁明县| 汝南县| 丘北县| 沐川县| 扶绥县| 瑞昌市| 永和县| 建瓯市| 五家渠市| 普格县| 青铜峡市| 奎屯市| 偃师市| 徐州市| 景泰县| 盐边县| 普兰店市| 雅安市| 清镇市| 台湾省| 萍乡市| 阿合奇县| 叶城县| 尚义县| 乌兰察布市| 尉犁县| 安西县| 疏附县| 乐至县|