<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

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

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

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

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

     
    在使用動態代理類時,我們必須實現InvocationHandler接口

    例:

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

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

    //具體角色

    public class RealSubject implements Subject
    {

        public RealSubject()
        {
        }

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

    }

    //代理處理器

    /**
     * 該代理類的內部屬性為Object類,實際使用時通過該類的構造函數DynamicSubject(Object obj)對其賦值;
     * 此外,在該類還實現了invoke方法,該方法中的 method.invoke(sub,args);
     * 其實就是調用被代理對象的將要被執行的方法,方法參數sub是實際的被代理對象,
     * args為執行被代理對象相應操作所需的參數。
     * 通過動態代理類,我們可以在調用之前或之后執行一些相關操作
     */

    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();
     }
    }

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

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


    網站導航:
    博客園   IT新聞   Chat2DB   C++博客   博問  
     
    <2008年5月>
    27282930123
    45678910
    11121314151617
    18192021222324
    25262728293031
    1234567

     

    長春語林科技歡迎您!

    常用鏈接

    留言簿(6)

    隨筆分類

    隨筆檔案

    文章分類

    文章檔案

    相冊

    收藏夾

    搜索

    •  

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 亚洲AV无码一区东京热久久| 亚洲欧洲无码一区二区三区| 久久久无码精品亚洲日韩按摩| 久久久久女教师免费一区| 亚洲午夜无码AV毛片久久| 一个人看的www免费高清| 国产国拍亚洲精品福利| 日韩精品无码免费专区网站 | 亚洲色图激情文学| 永久免费无码网站在线观看个| 波多野结衣免费视频观看| 美女被艹免费视频| 中文字幕亚洲电影| 亚洲av日韩av永久在线观看| 久久免费观看国产精品| 亚洲一区二区三区高清| 免费无码A片一区二三区| 国产亚洲av片在线观看18女人| 中文字幕成人免费高清在线 | 亚洲视频在线一区二区| 国产乱妇高清无乱码免费| 久久精品国产精品亚洲艾 | 亚洲欧洲无码一区二区三区| 日本黄页网站免费| 国产免费一区二区三区免费视频| 亚洲av日韩av不卡在线观看| 2021免费日韩视频网| 亚洲欧美在线x视频| 最近中文字幕mv免费高清视频7| 亚洲国产成人无码AV在线影院| 巨波霸乳在线永久免费视频| 国产成人精品亚洲2020| 精品亚洲视频在线观看| 中文字幕免费在线观看| 国产午夜亚洲精品不卡| 亚洲AV日韩AV鸥美在线观看| 一个人看的www在线观看免费| 亚洲第一页在线观看| 7m凹凸精品分类大全免费| 亚洲人成网站在线在线观看| 怡红院亚洲怡红院首页|