<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 閱讀(993) 評論(0)  編輯  收藏 所屬分類: 設計模式

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

    導航

    統計

    常用鏈接

    留言簿

    隨筆分類

    隨筆檔案

    搜索

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 亚洲国产欧美国产综合一区 | 国产黄在线观看免费观看不卡| 亚洲中文字幕无码爆乳AV| 96免费精品视频在线观看| 亚洲av无码一区二区三区天堂| 亚洲精品黄色视频在线观看免费资源| 久久精品无码精品免费专区| 亚洲中文字幕久久久一区| 日韩精品亚洲aⅴ在线影院| 精品国产免费人成电影在线观看| 校园亚洲春色另类小说合集| 亚洲AV日韩AV永久无码下载 | 亚洲网红精品大秀在线观看| 永久久久免费浮力影院| 精品视频在线免费观看| 欧美激情综合亚洲一二区| 无码乱人伦一区二区亚洲| 日产国产精品亚洲系列| 久久免费公开视频| 极品美女一级毛片免费| 一区二区三区免费视频观看| 亚洲一区二区三区播放在线| 亚洲日韩在线观看| 91视频国产免费| 99免费在线视频| 日韩亚洲翔田千里在线| 久久精品7亚洲午夜a| 亚洲高清免费视频| 成年人免费网站在线观看| 99热精品在线免费观看| 国产成人无码区免费网站| 中国一级特黄的片子免费| 中文字幕一区二区免费| 成人影片一区免费观看| 久久免费观看国产99精品| 99视频免费观看| 免费精品国产自产拍在线观看图片 | 69精品免费视频| h片在线免费观看| 亚洲第一成年免费网站| 成人免费a级毛片无码网站入口|