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

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

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

    JDK 動態代理機制

    首先定義一個抽象接口,JDK代理要求目標對象必須實現接口。(個人覺得這個應該是基于接口編程)
    以UserManager接口為例。在里面我們定義了一個add方法。

    code:

    package com.kangdy.test;

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


    接下來定義接口實現類。為了簡潔只是向客戶端輸出一句話。
    code:

    package com.kangdy.test;

    public class UserManagerImpl implements UserManager {

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

    }


    下面是我們的動態代理類。代理類實現了java.lang.reflect.InvocationHandler接口。
    動態代理機制用到jave反射方面的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{
     //目標對象索引
     private Object targetObject;
     
     /*
      * 通過構造方法引入目標對象
      */
     public JDKStaticProxy(Object targetObject){
      this.targetObject = targetObject;
     }
     
     /*
      * 創建代理對象
      */
     public Object createProxyObject(){
      Object proxyObject = Proxy.newProxyInstance(
        this.targetObject.getClass().getClassLoader(),
        this.targetObject.getClass().getInterfaces(), this);
      return proxyObject;
     }
     
     /*
      * proxyObject:代理對象
      * method: 被攔截到的目標對象的method
      * args: 被攔截到的目標對象的method的參數
      * (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 {
      //添加業務邏輯
      busniessLogic();
      
      //代理運行目標對象的method
      Object result = method.invoke(this.targetObject, args);
      return result;
     }
     
     /*
      * 添加業務邏輯,這里只是簡單打印一句話。
      */
     private void busniessLogic(){
      System.out.println("這是代理方法");
     }
     
    }

    代理類我添加很多注釋。應該很清楚了。這里我簡單說一下流程:當代理對象被調用的時候先會執行invoke方法,在此方法里面我們可添加
    自己的業務邏輯代碼,然后才會執行目標對象的真實方法:method.invoke(this.targetObject, args);目標對象方法可能會有返回值,在這
    里當存在返回值的時候我們返回一個Object.

    下面代碼是客戶端調用和調用結果:

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

    控制臺輸出結果:
     
    這是代理方法
    用戶 : 張三 添加成功

    posted on 2009-11-05 16:06 AK47 閱讀(999) 評論(0)  編輯  收藏 所屬分類: 設計模式

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

    導航

    統計

    常用鏈接

    留言簿

    隨筆分類

    隨筆檔案

    搜索

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 久久成人免费播放网站| fc2免费人成在线| 久久久久久成人毛片免费看| 久久久久亚洲精品无码网址| 国产成人不卡亚洲精品91| 黄网址在线永久免费观看 | 性生大片视频免费观看一级| 波多野结衣视频在线免费观看| 亚洲日本VA午夜在线影院| 女人毛片a级大学毛片免费| 亚洲色欲色欲www| 精品无码国产污污污免费| 欧美激情综合亚洲一二区| 日本无吗免费一二区| 国产精品亚洲一区二区三区久久| 四虎影在线永久免费观看| 国产成人1024精品免费| 国产精品亚洲аv无码播放| 日本免费一区二区三区| 久久久久精品国产亚洲AV无码| 最新欧洲大片免费在线| 亚洲另类无码专区丝袜| 亚洲精品岛国片在线观看| 99久久国产精品免费一区二区| 久久久婷婷五月亚洲97号色| 免费精品国偷自产在线在线| 亚洲AV色欲色欲WWW| 久久久久久久亚洲精品| 日本免费中文视频| 亚洲人成黄网在线观看| 国产在线观看www鲁啊鲁免费| 一级美国片免费看| 亚洲欧洲日产国产综合网| 四虎影院免费视频| a毛片免费全部播放完整成| 亚洲国产日韩在线成人蜜芽| 免费一看一级毛片人| 久久国产高潮流白浆免费观看| 久久亚洲AV成人无码国产最大| 亚洲综合日韩久久成人AV| 97视频免费在线|