黑马程序员技术交流社区

标题: 代理的疑问 [打印本页]

作者: 咖啡    时间: 2011-11-10 23:04
标题: 代理的疑问
如何写代理?假如说某个类的代理?应该如何计算某个方法的时间
作者: 绿影    时间: 2011-11-11 02:00
代理,说白了就是,你指定写一个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
去认真学习张老师的高新技术部分知识,原理懂了.你就能以不变应万变.




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2