[摘錄](méi)動(dòng)態(tài)代理

          摘錄地址:http://jamesby.javaeye.com/blog/71036

          用Spring大概有3個(gè)月,一直都是張口AOP,閉口AOP,但是Spring的AOP具體是怎么實(shí)現(xiàn)的,現(xiàn)在也不是十分清楚.

          只知道可以用JDK的動(dòng)態(tài)代理,基于接口,或者是cglib方式字節(jié)碼增強(qiáng).目前對(duì)JDK的動(dòng)態(tài)代理方式不是很理解,固拿出來(lái)探討下,我知道這應(yīng)該是個(gè)新手貼,但還是請(qǐng)大家給點(diǎn)意見.如果真正理解了動(dòng)態(tài)代理,那么對(duì)基于Spring AOP出現(xiàn)的各種現(xiàn)象就比較容易理解了.

          先貼上一段代碼.

          代碼
          1. package com.jamesby.proxy;   
          2. public interface CarCompany {   
          3.   
          4.     public void makeCar();    
          5.     public void abc();   
          6. }   
          7.   
          8. package com.jamesby.proxy;   
          9.   
          10. public class CarCompanyImpl implements CarCompany {   
          11.     public void makeCar() {   
          12.         System.out.println("Company A make a car!");   
          13.         abc();   
          14.     }   
          15.     public void abc()   
          16.     {   
          17.         System.out.println("abc is invoked!");   
          18.     }   
          19. }   
          20.   
          21. package com.jamesby.proxy;   
          22.   
          23. import java.lang.reflect.InvocationHandler;   
          24. import java.lang.reflect.Method;   
          25.   
          26. public class CarCompanyHandler implements InvocationHandler  {   
          27.     CarCompany com;   
          28.     //構(gòu)造時(shí)將被代理類綁定到Handler
          29.     public CarCompanyHandler(CarCompany com) {   
          30.         this.com = com;   
          31.     }   
          32.      
          33.   /**相當(dāng)于要把代理類的執(zhí)行方法重新包裝
          34.      *proxy:被代理類
          35.      *method:被代理類要執(zhí)行的方法
          36.      *args:被代理類要執(zhí)行的方法時(shí)需要的參數(shù)
          37.    **/
          38.     public Object invoke(Object proxy, Method method, Object[] args)   
          39.             throws Throwable {   
          40.             System.out.println("time1:" + System.currentTimeMillis());   
          41.             method.invoke(this.com, new Class[] {});   
          42.             System.out.println("time2:" + System.currentTimeMillis());   
          43.         return null;   
          44.     }   
          45. }   
          46.   
          47. package com.jamesby.proxy;   
          48.   
          49. import java.lang.reflect.Proxy;   
          50.   
          51. public class Test {   
          52.     public static void main(String[] arg) {   
          53.         CarCompanyImpl a = new CarCompanyImpl();   
          54.         //將被代理類綁定到handler 
          55.         CarCompanyHandler handler = new CarCompanyHandler(a);   
          56.         // 產(chǎn)生一個(gè)新的代理類 ,將handler綁定到代理類中  
          57.         CarCompany com = (CarCompany) Proxy.newProxyInstance(Test.class  
          58.                 .getClassLoader(), new Class[] { CarCompany.class }, handler);   
          59.         com.makeCar();   
          60.     }   
          61. }  



          歡迎大家訪問(wèn)我的個(gè)人網(wǎng)站 萌萌的IT人

          posted on 2006-06-01 11:20 見酒就暈 閱讀(92) 評(píng)論(0)  編輯  收藏 所屬分類: J2EE文章

          <2025年6月>
          25262728293031
          1234567
          891011121314
          15161718192021
          22232425262728
          293012345

          導(dǎo)航

          統(tǒng)計(jì)

          常用鏈接

          留言簿(3)

          我參與的團(tuán)隊(duì)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          收藏夾

          BLOG

          FRIENDS

          LIFE

          搜索

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 水富县| 天水市| 如东县| 刚察县| 丁青县| 莱州市| 华阴市| 锡林郭勒盟| 大安市| 竹溪县| 天峨县| 谢通门县| 军事| 河西区| 米泉市| 霍山县| 南昌县| 和林格尔县| 乐昌市| 那坡县| 城口县| 舟山市| 海淀区| 夹江县| 衡山县| 阳高县| 攀枝花市| 曲阜市| 墨脱县| 剑阁县| 河北省| 电白县| 绥化市| 巴塘县| 太仆寺旗| 平阴县| 张家界市| 陇南市| 亳州市| 屏南县| 龙山县|