A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 郭军亮 中级黑马   /  2013-5-5 08:47  /  1072 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. package cn.itcast.day3;

  2. import java.lang.reflect.Constructor;
  3. import java.lang.reflect.InvocationHandler;
  4. import java.lang.reflect.Method;
  5. import java.lang.reflect.Proxy;
  6. import java.util.ArrayList;
  7. import java.util.Collection;

  8. public class ProxyTest {

  9.         /**
  10.          * @param args
  11.          */
  12.         public static void main(String[] args) throws Exception{
  13.                 // TODO Auto-generated method stub
  14.                 Class clazzProxy1 = Proxy.getProxyClass(Collection.class.getClassLoader(), Collection.class);

  15. final ArrayList target = new ArrayList();                       
  16.                 Collection proxy3 = (Collection)getProxy(target,new MyAdvice());
  17.                 proxy3.add("zxx");
  18.                 proxy3.add("lhm");
  19.                 proxy3.add("bxd");
  20.                 System.out.println(proxy3.size());
  21.                 System.out.println(proxy3.getClass().getName());
  22.         }

  23.         private static Object getProxy(final Object target,final Advice advice) {
  24.                 Object proxy3 = Proxy.newProxyInstance(
  25.                                 target.getClass().getClassLoader(),
  26.                                 /*new Class[]{Collection.class},*/
  27.                                 target.getClass().getInterfaces(),
  28.                                 new InvocationHandler(){
  29.                                
  30.                                         public Object invoke(Object proxy, Method method, Object[] args)
  31.                                                         throws Throwable {

  32.                                                 /*long beginTime = System.currentTimeMillis();
  33.                                                 Object retVal = method.invoke(target, args);
  34.                                                 long endTime = System.currentTimeMillis();
  35.                                                 System.out.println(method.getName() + " running time of " + (endTime - beginTime));
  36.                                                 return retVal;*/
  37.                                                

  38.                                                 advice.beforeMethod(method);
  39.                                                 Object retVal = method.invoke(target, args);
  40.                                                 advice.afterMethod(method);
  41.                                                 return retVal;                                               
  42.                                                
  43.                                         }
  44.                                 }
  45.                                 );
  46.                 return proxy3;
  47.         }

  48. }
  49. package cn.itcast.day3;

  50. import java.lang.reflect.Method;

  51. public interface Advice {
  52.         void beforeMethod(Method method);
  53.         void afterMethod(Method method);
  54. }
  55. package cn.itcast.day3;

  56. import java.lang.reflect.Method;

  57. public class MyAdvice implements Advice {
  58.         long beginTime = 0;
  59.         public void afterMethod(Method method) {
  60.                 // TODO Auto-generated method stub
  61.                 System.out.println("从传智播客毕业上班啦!");               
  62.                 long endTime = System.currentTimeMillis();
  63.                 System.out.println(method.getName() + " running time of " + (endTime - beginTime));

  64.         }

  65.         public void beforeMethod(Method method) {
  66.                 // TODO Auto-generated method stub
  67.                 System.out.println("到传智播客来学习啦!");
  68.                 beginTime = System.currentTimeMillis();
  69.         }

  70. }

复制代码
请问一下,add()方法是怎样调用代理的,请详细介绍一下这之间的过程,一直搞不明白是这之间是怎样传递的

1 个回复

倒序浏览
代理模式一共需要三个类 代理类和目标类,InvocationHandler。
它们的关系是代理类--InvocationHandler--目标类
当调用代理类的add方法时,代理类会调用InvocationHandler类的Invoke()方法,而Invoke方法内部再去调用目标类的add()方法
这样就完成了一次代理。代理模式大概的流程。其他的都是实现细节,楼主多思考思考就好了。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马