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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 咖啡 黑马帝   /  2011-11-10 23:04  /  1424 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

如何写代理?假如说某个类的代理?应该如何计算某个方法的时间

2 个回复

倒序浏览
绿影 黑马帝 2011-11-11 02:00:29
沙发
代理,说白了就是,你指定写一个Proxy类帮另一个A类干活,但是Proxy类自己并不亲自干这个活,而是通过反射的方式让第三方具有相同功能的类C来干这个活,而Proxy自己在拿到这个c干好活得结果后对这个结果进行一些操作(当然也可以将结果原封不动的直接交给A),然后交给A。下面看一个实例:
  1. import java.lang.reflect.InvocationHandler;
  2. import java.lang.reflect.Method;
  3. import java.lang.reflect.Proxy;
  4. import java.util.ArrayList;
  5. import java.util.Collection;

  6. public class ProxyArrayList_3 {

  7.         public static void main(String[] args) {
  8.                 final ArrayList target = new ArrayList();
  9.                 Collection proxy = (Collection) getProxy(target);//proxy是ArrayList的代理
  10.                 proxy.add(1);
  11.                 proxy.add(2);
  12.                 proxy.add(3);
  13.                 System.out.println(proxy.size());
  14.                 System.out.println(proxy.getClass().getName());

  15.         }

  16.         public static Object getProxy(final Object target) {
  17.                 Object proxy = Proxy.newProxyInstance(
  18.                                 target.getClass().getClassLoader(),
  19.                                 target.getClass().getInterfaces(),
  20.                                 new InvocationHandler() {
  21.                                        
  22.                                         @Override
  23.                                         //invoke方法中就是对调用C类干活,并对返回的结果进行操作的过程
  24.                                         public Object invoke(Object proxy, Method method, Object[] args)
  25.                                                         throws Throwable {
  26.                                                 long beginTime = System.currentTimeMillis();
  27.                                                 Object reValue = method.invoke(target, args);//调用C类中的方法干活
  28.                                                 long endTime = System.currentTimeMillis();
  29.                                                 //对结果进行操作:另加的计算方法运行的时间
  30.                                                 System.out.println(method.getName() + "'s ran time is " + (endTime-beginTime));
  31.                                                 return reValue;
  32.                                         }
  33.                                 });
  34.                 return proxy;
  35.         }
  36. }
复制代码
回复 使用道具 举报
吉许 黑马帝 2011-11-11 11:02:07
藤椅
去认真学习张老师的高新技术部分知识,原理懂了.你就能以不变应万变.
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马