黑马程序员技术交流社区

标题: 获取动态代理类名称的疑问 [打印本页]

作者: 徐帅    时间: 2013-1-12 12:32
标题: 获取动态代理类名称的疑问
本帖最后由 张向辉 于 2013-1-29 11:12 编辑

问题:
System.out.println(proxy3.getClass().getName());
当一个代理类调用invoke方法,去执行目标,目标的getClass().getName()应该返回ArrayList,但结果却为Proxy0.。

视频中张老师解释的原因为:
只有HashCode,equals和toString方法才委托给handler,即自动调用invoke方法,其他方法有自己的实现。

我对于张老师的解释太理解,System.out.println(proxy3.getClass().getName()); 这条语句不是调用到了toString方法么?
按照老师的解释是该代理类并没有委托给handler,也就是说没有调用invoke方法,所以打印结果为Proxy0。

还有就是既然proxy3.getClass().getName()获取不到目标类的名称,那有什么方法可以得到呢,即得到ArrayList。
下面是代码,希望大家帮忙解答,谢谢喽
  1. package cn.xushuai.test;
  2. import java.lang.reflect.Constructor;
  3. import java.lang.reflect.InvocationHandler;
  4. import java.lang.reflect.InvocationTargetException;
  5. import java.lang.reflect.Method;
  6. import java.lang.reflect.Proxy;
  7. import java.util.ArrayList;
  8. import java.util.Collection;

  9. public class ProxyTest3 {
  10.         public static void main(String[] args) throws SecurityException, NoSuchMethodException, IllegalArgumentException, InstantiationException, IllegalAccessException, InvocationTargetException {  

  11. //使用Proxy类的newProxyInstance方法直接获取字节码和实例对象
  12. //指定一个目标  
  13.    
  14.                     Collection proxy3 = (Collection)Proxy.newProxyInstance(  
  15.           Collection.class.getClassLoader(),   
  16.           new Class[]{Collection.class},
  17.           new InvocationHandler(){
  18.                         
  19.       @Override  
  20.       public Object invoke(Object proxy, Method method,Object[] args) throws Throwable {  
  21.               
  22.               ArrayList target = new ArrayList();
  23.               
  24.               //将系统功能抽取成为一个对象,通过接口方法调用,而不需知道内部的方法
  25.           long beginTime = System.currentTimeMillis();  
  26.           //在目标对象身上去执行代理执行的方法,  
  27.           Object retVal = method.invoke(target, args);                           
  28.           long endTime = System.currentTimeMillis();  
  29.           System.out.println("The running time of "+method.getName()+" method is "+(endTime-beginTime));  
  30.           return retVal;//目标方法将值返回给代理的方法,add方法的返回值就从代理方法的返回值上取  
  31.         }     
  32.       }  
  33.   );

  34.                   System.out.println(proxy3.getClass().getName());  
  35.                   /*调用invoke方法,去执行目标,目标的getClass().getName()应该返回ArrayList,但结果却为Proxy0.。
  36.                 原因:只有HashCode,equals和toString方法才委托给handler,即自动调用invoke    方法,其他方法有自己的实现。*/  
  37.   }

  38. }
复制代码

作者: 徐帅    时间: 2013-1-12 17:45
没人回答啊,自己顶起来
作者: Rancho_Gump    时间: 2013-1-12 20:58
我觉得就这个例子 想通过代理获得目标类  估计不大可能  除非在invoke方法中将目标传出去   但这样做代理就失去意义了  




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