[摘录]动态代理

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

用Spring大概有3个月,一直都是张口AOP,闭口AOP,但是Spring的AOP具体是怎么实现的,现在也不是十分清楚.

只知道可以用JDK的动态代理,基于接口,或者是cglib方式字节码增强.目前对JDK的动态代理方式不是很理解,固拿出来探讨下,我知道这应该是个新手贴,但还是请大家给点意见.如果真正理解了动态代理,那么对基于Spring AOP出现的各种现象就比较容易理解了.

先贴上一段代码.

代码
  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.     //构造时将被代理类绑定到Handler
  29.     public CarCompanyHandler(CarCompany com) {   
  30.         this.com = com;   
  31.     }   
  32.      
  33.   /**相当于要把代理类的执行方法重新包装
  34.      *proxy:被代理类
  35.      *method:被代理类要执行的方法
  36.      *args:被代理类要执行的方法时需要的参数
  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.         // 产生一个新的代理类 ,将handler绑定到代理类中  
  57.         CarCompany com = (CarCompany) Proxy.newProxyInstance(Test.class  
  58.                 .getClassLoader(), new Class[] { CarCompany.class }, handler);   
  59.         com.makeCar();   
  60.     }   
  61. }  



欢迎大家访问我的个人网站 萌萌的IT人

posted on 2006-06-01 11:20 见酒就晕 阅读(89) 评论(0)  编辑  收藏 所属分类: J2EE文章


只有注册用户登录后才能发表评论。


网站导航:
 
<2025年1月>
2930311234
567891011
12131415161718
19202122232425
2627282930311
2345678

导航

统计

常用链接

留言簿(3)

我参与的团队

随笔分类

随笔档案

文章分类

文章档案

收藏夹

BLOG

FRIENDS

LIFE

搜索

最新评论

阅读排行榜

评论排行榜