JDK 動(dòng)態(tài)代理機(jī)制

          首先定義一個(gè)抽象接口,JDK代理要求目標(biāo)對(duì)象必須實(shí)現(xiàn)接口。(個(gè)人覺得這個(gè)應(yīng)該是基于接口編程)
          以UserManager接口為例。在里面我們定義了一個(gè)add方法。

          code:

          package com.kangdy.test;

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


          接下來定義接口實(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;
           
           /*
            * 通過構(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)單說一下流程:當(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 閱讀(996) 評(píng)論(0)  編輯  收藏 所屬分類: 設(shè)計(jì)模式

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

          導(dǎo)航

          統(tǒng)計(jì)

          常用鏈接

          留言簿

          隨筆分類

          隨筆檔案

          搜索

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 汉阴县| 子洲县| 来宾市| 本溪市| 青冈县| 清镇市| 沙田区| 弥渡县| 焉耆| 天津市| 延津县| 奎屯市| 凌海市| 古田县| 黎川县| 定陶县| 建始县| 安乡县| 吉安市| 金山区| 东乡| 大渡口区| 济源市| 大石桥市| 达尔| 监利县| 娱乐| 齐河县| 林周县| 应用必备| 彝良县| 喀喇沁旗| 沾化县| 江油市| 施秉县| 伽师县| 双城市| 大洼县| 抚州市| 南康市| 南陵县|