qileilove

          blog已經轉移至github,大家請訪問 http://qaseven.github.io/

          Java中的動態代理模式

           前言:
            最近一直在分析hadoop的RPC機制。在hadoop中,DataNode和NameNode之間的控制信息的交流是通過RPC機制完成的,采用的是動態代理和java NIO的方式。DataNode端是通過獲得NameNode的代理,通過該代理和NameNode進行通信的,為了更好的分析hadoop的RPC機制我想先分析一下動態代理是怎么實現。下面就是動態代理的最最簡單的代碼實現,我們一起來看看吧。
            代碼如下:
          package cn.xiaolu;
          import java.lang.reflect.InvocationHandler;
          import java.lang.reflect.Method;
          import java.lang.reflect.Proxy;
          /**
          * 動態代理類使用到了一個接口InvocationHandler和一個代理類Proxy ,這兩個類配合使用實現了動態代理的功能。
          * 那么什么是動態代理呢?
          * 我們平常說的代理類是指: 給每個具體類寫一個代理類,以后要使用某個具體類時,只要創建它的代理類的對象,然后調用代理類的方法就可以了。
          * 可是如果現在有許多的具體類,那就需要有許多的代理類才可以,這樣很顯然不合適。所以動態代理就應運而生了,我們只要寫一個類實現
          * InvocationHandler 并實現它的invoke方法,然后再用Proxy的工廠方法newProxyInstance()創建一個代理對象,這個對象同樣可以實現對具體類的代理功能。
          * 而且想代理哪個具體類,只要給Handler(以下代碼中的Invoker)的構造器傳入這個具體對象的實例就可以了。感覺是不是自己為該具體類造了一個代理類呢?呵呵~
          */
          //接口類
          interface AbstractClass {
          public void show();
          }
          // 具體類A
          class ClassA implements AbstractClass {
          @Override
          public void show() {
          // TODO Auto-generated method stub
          System.out.println("我是A類!");
          }
          }
          // 具體類B
          class ClassB implements AbstractClass {
          @Override
          public void show() {
          // TODO Auto-generated method stub
          System.out.println("我是B類!");
          }
          }
          //動態代理類,實現InvocationHandler接口
          class Invoker implements InvocationHandler {
          AbstractClass ac;
          public Invoker(AbstractClass ac) {
          this.ac = ac;
          }
          @Override
          public Object invoke(Object proxy, Method method, Object[] arg)
          throws Throwable {
          //調用之前可以做一些處理
          method.invoke(ac, arg);
          //調用之后也可以做一些處理
          return null;
          }
          }
          /**
          測試
          * @author 小路
          */
          class DynamicProxyTest {
          public static void main(String[] args) {
          //創建具體類ClassB的處理對象
          Invoker invoker1=new Invoker(new ClassA());
          //獲得具體類ClassA的代理
          AbstractClass ac1 = (AbstractClass) Proxy.newProxyInstance(
          AbstractClass.class.getClassLoader(),
          new Class[] { AbstractClass.class }, invoker1);
          //調用ClassA的show方法。
          ac1.show();
          //創建具體類ClassB的處理對象
          Invoker invoker2=new Invoker(new ClassB());
          //獲得具體類ClassB的代理
          AbstractClass ac2 = (AbstractClass) Proxy.newProxyInstance(
          AbstractClass.class.getClassLoader(),
          new Class[] { AbstractClass.class }, invoker2);
          //調用ClassB的show方法。
          ac2.show();
          }
          }
            程序運行后的結果如下:
            我是A類!
            我是B類!

          posted on 2014-03-20 11:25 順其自然EVO 閱讀(254) 評論(0)  編輯  收藏 所屬分類: 測試學習專欄

          <2014年3月>
          2324252627281
          2345678
          9101112131415
          16171819202122
          23242526272829
          303112345

          導航

          統計

          常用鏈接

          留言簿(55)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 伊金霍洛旗| 泗洪县| 巴彦县| 通州市| 云林县| 汉川市| 阿克陶县| 鄢陵县| 竹溪县| 罗定市| 平果县| 玛纳斯县| 上饶市| 信丰县| 本溪市| 辽宁省| 宣武区| 南溪县| 镇康县| 胶南市| 兴安盟| 墨脱县| 分宜县| 清河县| 兴文县| 延寿县| 屯昌县| 桦甸市| 正安县| 铁岭市| 临颍县| 肃北| 兖州市| 温宿县| 广州市| 乐山市| 保山市| 柞水县| 仁怀市| 永善县| 沾益县|