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)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 习水县| 鄯善县| 洪洞县| 新沂市| 大丰市| 京山县| 海盐县| 鹿邑县| 宁海县| 贡觉县| 大田县| 疏勒县| 嘉善县| 文昌市| 花莲县| 扬中市| 灯塔市| 呈贡县| 侯马市| 樟树市| 隆回县| 会东县| 阿尔山市| 元氏县| 吉首市| 福建省| 怀柔区| 敦煌市| 惠州市| 宜阳县| 界首市| 乐亭县| 琼海市| 灌云县| 六盘水市| 巨野县| 拉萨市| 仙游县| 微山县| 龙门县| 托克托县|