黑马程序员技术交流社区

标题: 动态生成类的内部代码 [打印本页]

作者: 位雪    时间: 2012-7-25 14:46
标题: 动态生成类的内部代码
  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
复制代码

作者: 牛少锋    时间: 2012-7-25 14:59
是的,每调用一次add方法,就会打印一次,这就是传说中的反射了
至于怎么调用的,这个你可以研究源码O(∩_∩)O哈!偶也不懂
作者: 淡然    时间: 2012-7-25 15:27
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);

                 }

                  ···

}




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