mulinka

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

          Dynamic proxy(動態代理模式)

          Posted on 2005-07-29 11:10 魔之卡卡 閱讀(501) 評論(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中的動態代理實現數據庫連接池》
          主站蜘蛛池模板: 尼玛县| 英德市| 高州市| 普格县| 鲁甸县| 崇明县| 武夷山市| 大关县| 静乐县| 惠安县| 济源市| 婺源县| 宝清县| 徐汇区| 滁州市| 逊克县| 五寨县| 海原县| 忻城县| 民权县| 安吉县| 巩留县| 犍为县| 闸北区| 礼泉县| 玉环县| 新河县| 武城县| 榆林市| 阳曲县| 张家界市| 南涧| 金山区| 方城县| 康乐县| 石景山区| 大悟县| 原阳县| 普宁市| 宁乡县| 华宁县|