<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)論排行榜

    主站蜘蛛池模板: 99久久国产精品免费一区二区 | 国产日韩久久免费影院| 免费被黄网站在观看| 亚洲AV综合色区无码二区偷拍| 91麻豆国产免费观看| 亚洲视频日韩视频| 91香焦国产线观看看免费| 夜夜亚洲天天久久| 91免费播放人人爽人人快乐| 亚洲一区中文字幕在线观看| 男女超爽刺激视频免费播放| 亚洲三级高清免费| 国产成人涩涩涩视频在线观看免费| 麻豆亚洲AV成人无码久久精品| 人人狠狠综合久久亚洲高清| 国产精品免费久久久久影院 | 亚洲人成在线观看| 全部免费毛片在线播放| 亚洲午夜久久久精品电影院| 在线免费不卡视频| 九九免费精品视频在这里| 亚洲精品成人片在线观看精品字幕| 午夜视频免费在线观看| 亚洲一本之道高清乱码| 又粗又硬免费毛片| 在线观看肉片AV网站免费| 亚洲精品中文字幕无乱码麻豆| 少妇亚洲免费精品| 国产精品免费一区二区三区四区| 亚洲伊人久久大香线蕉在观| 亚洲AV成人潮喷综合网| 久久久久久国产精品免费免费男同 | 亚洲Av综合色区无码专区桃色| 国产成人精品免费视频网页大全| 亚洲国产成人AV在线播放| 亚洲日本韩国在线| 67pao强力打造国产免费| 亚洲av无码专区首页| 亚洲人精品午夜射精日韩 | 亚洲色丰满少妇高潮18p| 亚洲人午夜射精精品日韩|