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

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

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

    JDK 動(dòng)態(tài)代理機(jī)制

    首先定義一個(gè)抽象接口,JDK代理要求目標(biāo)對(duì)象必須實(shí)現(xiàn)接口。(個(gè)人覺(jué)得這個(gè)應(yīng)該是基于接口編程)
    以UserManager接口為例。在里面我們定義了一個(gè)add方法。

    code:

    package com.kangdy.test;

    public interface UserManager {
     public void addUser(String  userName);
    }


    接下來(lái)定義接口實(shí)現(xiàn)類。為了簡(jiǎn)潔只是向客戶端輸出一句話。
    code:

    package com.kangdy.test;

    public class UserManagerImpl implements UserManager {

     public void addUser(String userName) {
      System.out.println("用戶 : "+userName+" 添加成功");
     }

    }


    下面是我們的動(dòng)態(tài)代理類。代理類實(shí)現(xiàn)了java.lang.reflect.InvocationHandler接口。
    動(dòng)態(tài)代理機(jī)制用到j(luò)ave反射方面的api,反射方面的資料往上很多的。不清楚的可以先查閱讀一下
    code:

    package com.kangdy.test;

    import java.lang.reflect.InvocationHandler;
    import java.lang.reflect.Method;
    import java.lang.reflect.Proxy;

    public class JDKStaticProxy implements InvocationHandler{
     //目標(biāo)對(duì)象索引
     private Object targetObject;
     
     /*
      * 通過(guò)構(gòu)造方法引入目標(biāo)對(duì)象
      */
     public JDKStaticProxy(Object targetObject){
      this.targetObject = targetObject;
     }
     
     /*
      * 創(chuàng)建代理對(duì)象
      */
     public Object createProxyObject(){
      Object proxyObject = Proxy.newProxyInstance(
        this.targetObject.getClass().getClassLoader(),
        this.targetObject.getClass().getInterfaces(), this);
      return proxyObject;
     }
     
     /*
      * proxyObject:代理對(duì)象
      * method: 被攔截到的目標(biāo)對(duì)象的method
      * args: 被攔截到的目標(biāo)對(duì)象的method的參數(shù)
      * (non-Javadoc)
      * @see java.lang.reflect.InvocationHandler#invoke(java.lang.Object, java.lang.reflect.Method, java.lang.Object[])
      */
     public Object invoke(Object proxyObject, Method method, Object[] args)
       throws Throwable {
      //添加業(yè)務(wù)邏輯
      busniessLogic();
      
      //代理運(yùn)行目標(biāo)對(duì)象的method
      Object result = method.invoke(this.targetObject, args);
      return result;
     }
     
     /*
      * 添加業(yè)務(wù)邏輯,這里只是簡(jiǎn)單打印一句話。
      */
     private void busniessLogic(){
      System.out.println("這是代理方法");
     }
     
    }

    代理類我添加很多注釋。應(yīng)該很清楚了。這里我簡(jiǎn)單說(shuō)一下流程:當(dāng)代理對(duì)象被調(diào)用的時(shí)候先會(huì)執(zhí)行invoke方法,在此方法里面我們可添加
    自己的業(yè)務(wù)邏輯代碼,然后才會(huì)執(zhí)行目標(biāo)對(duì)象的真實(shí)方法:method.invoke(this.targetObject, args);目標(biāo)對(duì)象方法可能會(huì)有返回值,在這
    里當(dāng)存在返回值的時(shí)候我們返回一個(gè)Object.

    下面代碼是客戶端調(diào)用和調(diào)用結(jié)果:

    code:

    package com.kangdy.test;

    import org.junit.Test;

    public class TestJDKStaticProxy {
     
     @Test public void testJDKStaticProxy(){
      JDKStaticProxy proxy = new JDKStaticProxy(new UserManagerImpl());
         UserManager userManager = (UserManager) proxy.createProxyObject();
      userManager.addUser("張三");
      
     }
    }

    控制臺(tái)輸出結(jié)果:
     
    這是代理方法
    用戶 : 張三 添加成功

    posted on 2009-11-05 16:06 AK47 閱讀(993) 評(píng)論(0)  編輯  收藏 所屬分類: 設(shè)計(jì)模式

    <2009年11月>
    25262728293031
    1234567
    891011121314
    15161718192021
    22232425262728
    293012345

    導(dǎo)航

    統(tǒng)計(jì)

    常用鏈接

    留言簿

    隨筆分類

    隨筆檔案

    搜索

    最新評(píng)論

    閱讀排行榜

    評(píng)論排行榜

    主站蜘蛛池模板: 人妻无码久久一区二区三区免费| 国产成人综合亚洲一区| 丝瓜app免费下载网址进入ios| 无码专区一va亚洲v专区在线| 亚洲精华国产精华精华液网站| 日本媚薬痉挛在线观看免费| 在线观看亚洲网站| 免费va人成视频网站全| 粉色视频成年免费人15次| 亚洲精品高清一二区久久| a级毛片免费观看网站| 久久青青草原亚洲av无码| 中文字幕永久免费| 亚洲高清在线视频| 免费无码又爽又刺激高潮视频| 国产成人亚洲合集青青草原精品| 国产成人va亚洲电影| 国产精品极品美女免费观看| 无码天堂va亚洲va在线va| 亚洲人成人无码网www国产| 三年片免费高清版| 亚洲精品美女在线观看| 无码一区二区三区AV免费| 爱爱帝国亚洲一区二区三区| 国产亚洲精品看片在线观看 | www成人免费视频| 亚洲老妈激情一区二区三区| 无码国产精品一区二区免费16 | 成人免费黄色网址| 亚洲午夜无码久久| 亚洲精品国产成人影院| 精品无码AV无码免费专区| 亚洲精品成a人在线观看夫| 国产日产亚洲系列最新| 131美女爱做免费毛片| 国产偷国产偷亚洲高清在线| 久久综合九九亚洲一区| 免费黄网在线观看| 青青操免费在线观看| 亚洲av无码成人精品区一本二本| 亚洲中文久久精品无码ww16|