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

          導航

          統計

          常用鏈接

          留言簿

          隨筆分類

          隨筆檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 郯城县| 兰考县| 邵东县| 明水县| 无棣县| 南涧| 四平市| 白朗县| 涞水县| 高青县| 江山市| 衡东县| 慈溪市| 宁陵县| 休宁县| 土默特左旗| 基隆市| 西城区| 锡林郭勒盟| 静乐县| 香河县| 凯里市| 乐山市| 西乌珠穆沁旗| 和顺县| 耒阳市| 潞城市| 略阳县| 清新县| 时尚| 云龙县| 明星| 长沙县| 木里| 九江县| 聊城市| 临颍县| 宝兴县| 喜德县| 名山县| 桑植县|