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

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

          導航

          統計

          常用鏈接

          留言簿

          隨筆分類

          隨筆檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 石门县| 尤溪县| 邛崃市| 湖州市| 轮台县| 福建省| 舞阳县| 双桥区| 寿阳县| 土默特右旗| 三原县| 临汾市| 太湖县| 枞阳县| 东港市| 房山区| 伽师县| 泾阳县| 微山县| 庄河市| 天镇县| 萨迦县| 南昌县| 巴林右旗| 永登县| 宝丰县| 陇西县| 克什克腾旗| 古浪县| 西华县| 定远县| 弥勒县| 文成县| 桐柏县| 宁夏| 罗江县| 奎屯市| 陇南市| 安西县| 镇雄县| 大新县|