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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 位雪 中级黑马   /  2012-7-25 14:46  /  2150 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. package cn.istcast.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. Collection proxy3 = (Collection)Proxy.newProxyInstance(Collection.class.getClassLoader(),
  14. new Class[] {Collection.class},
  15. new InvocationHandler(){
  16. ArrayList target = new ArrayList();
  17. public Object invoke(Object proxy, Method method,
  18. Object[] args) throws Throwable {

  19. long beginTime = System.currentTimeMillis();
  20. Object retVal = method.invoke(target, args);
  21. long endTime = System.currentTimeMillis();
  22. System.out.println(method.getName()+"running time of " + (endTime - beginTime));//这里只打印一次,为什么addrunning time of 出现三次,是因为proxy3.add三次吗?这是怎么调用的,哪位能指点一下,谢谢啦!
  23. return retVal;

  24. }

  25. }
  26. );
  27. proxy3.add("zxx");
  28. proxy3.add("lhm");
  29. proxy3.add("bxd");
  30. System.out.println(proxy3.size());

  31. }

  32. }
  33. 打印结果:
  34. addrunning time of 0
  35. addrunning time of 0
  36. addrunning time of 0
  37. sizerunning time of 1
  38. 3
复制代码

2 个回复

倒序浏览
是的,每调用一次add方法,就会打印一次,这就是传说中的反射了
至于怎么调用的,这个你可以研究源码O(∩_∩)O哈!偶也不懂
回复 使用道具 举报
20.public Object invoke(Object proxy, Method method,

21.Object[] args) throws Throwable {

22.

23.long beginTime = System.currentTimeMillis();

24.Object retVal = method.invoke(target, args);

25.long endTime = System.currentTimeMillis();

26.System.out.println(method.getName()+"running time of " + (endTime - beginTime));//这里只打印一次,为什么addrunning time of 出现三次,是因为proxy3.add三次吗?这是怎么调用的,哪位能指点一下,谢谢啦!

27.return retVal;

28.

29.}
代理类中的每个方法都要调用InvocationHandler类中的invoke方法。

具体如下:

Class  Proxy${

               methodName(Object obj){

                              return   handler.invoke(Object  proxy, Method  method ,Object[] args);

                 }

                  ···

}
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马