posts - 325,  comments - 25,  trackbacks - 0
           
          如果要按照上述的方法使用代理模式,那么真實角色必須是事先已經(jīng)存在的,并將其作為代理對象的內(nèi)部屬性。但是實際使用時,一個真實角色必須對應(yīng)一個 代理角色,如果大量使用會導(dǎo)致類的急劇膨脹;此外,如果事先并不知道真實角色,該如何使用代理呢?這個問題可以通過Java的動態(tài)代理類來解決

           
          Java動態(tài)代理類位于java.lang.reflect包下,一般主要涉及到以下兩個類:
          (1)Interface InvocationHandler:該接口中僅定義了一個方法
          §public object invoke(Object obj,Method method, Object[] args)
          在實際使用時,第一個參數(shù)obj一般是指代理類,method是被代理的方法,如上例中的request(),args為該方法的參數(shù)數(shù)組。 這個抽象方法在代理類中動態(tài)實現(xiàn)。
          (2)Proxy:該類即為動態(tài)代理類,作用類似于上例中的ProxySubject,其中主要包含以下內(nèi)容

           
          protected Proxy(InvocationHandler h):構(gòu)造函數(shù),用于給內(nèi)部的h賦值。
          static Class getProxyClass (ClassLoader loader, Class[] interfaces):獲得一個代理類,其中l(wèi)oader是類裝載器,interfaces是真實類所擁有的全部接口的數(shù)組。
          static Object newProxyInstance(ClassLoader loader, Class[] interfaces, InvocationHandler h):返回代理類的一個實例,返回后的代理類可以當(dāng)作被代理類使用(可使用被代理類的在Subject接口中聲明過的方法)

           
          所謂Dynamic Proxy是這樣一種class:它是在運行時生成的class,在生成它時你必須提供一組interface給它,然后該class就宣稱它實現(xiàn)了這些 interface。你當(dāng)然可以把該class的實例當(dāng)作這些interface中的任何一個來用。當(dāng)然,這個Dynamic Proxy其實就是一個Proxy,它不會替你作實質(zhì)性的工作,在生成它的實例時你必須提供一個handler,由它接管實際的工作

           
          在使用動態(tài)代理類時,我們必須實現(xiàn)InvocationHandler接口

          例:

          //抽象角色(之前是抽象類,此處應(yīng)改為接口):

          public interface Subject
          {
              abstract public void request();
          }

          //具體角色

          public class RealSubject implements Subject
          {

              public RealSubject()
              {
              }

              public void request()
              {
                  System.out.println("From real subject.");
              }

          }

          //代理處理器

          /**
           * 該代理類的內(nèi)部屬性為Object類,實際使用時通過該類的構(gòu)造函數(shù)DynamicSubject(Object obj)對其賦值;
           * 此外,在該類還實現(xiàn)了invoke方法,該方法中的 method.invoke(sub,args);
           * 其實就是調(diào)用被代理對象的將要被執(zhí)行的方法,方法參數(shù)sub是實際的被代理對象,
           * args為執(zhí)行被代理對象相應(yīng)操作所需的參數(shù)。
           * 通過動態(tài)代理類,我們可以在調(diào)用之前或之后執(zhí)行一些相關(guān)操作
           */

          public class DynamicSubject implements InvocationHandler
          {
              private Object sub;

              public DynamicSubject()
              {
              }

              public DynamicSubject(Object obj)
              {
                  sub = obj;
              }

              public Object invoke(Object proxy, Method method, Object[] args) throws Throwable
              {
                  System.out.println("before calling " + method);

                  method.invoke(sub, args);

                  System.out.println("after calling " + method);

                  return null;
           }

          }

          //客戶端

          public class Client
          {
           static public void main(String[] args) throws Throwable
           {

            RealSubject rs = new RealSubject(); // 在這里指定被代理類
            InvocationHandler ds = new DynamicSubject(rs);
            Class<?> cls = rs.getClass();

            // 以下是一次性生成代理

            Subject subject = (Subject) Proxy.newProxyInstance(
              cls.getClassLoader(), cls.getInterfaces(), ds);

            subject.request();
           }
          }

           
          動態(tài)代理使用場合:
          調(diào)試
          遠程方法調(diào)用(RMI)
          posted on 2008-05-26 09:07 長春語林科技 閱讀(744) 評論(0)  編輯  收藏

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


          網(wǎng)站導(dǎo)航:
           
          <2008年5月>
          27282930123
          45678910
          11121314151617
          18192021222324
          25262728293031
          1234567

           

          長春語林科技歡迎您!

          常用鏈接

          留言簿(6)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          相冊

          收藏夾

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 田东县| 涿鹿县| 杭州市| 宝清县| 河南省| 遂川县| 海阳市| 克山县| 门源| 福贡县| 上饶市| 呼玛县| 临夏县| 马尔康县| 炎陵县| 梨树县| 玛多县| 海安县| 禹州市| 酉阳| 衡山县| 万源市| 格尔木市| 彭泽县| 从化市| 西和县| 高雄市| 西乌珠穆沁旗| 凤城市| 宝应县| 璧山县| 富民县| 潜江市| 贺州市| 石首市| 瑞金市| 游戏| 罗定市| 平湖市| 绩溪县| 乌拉特中旗|