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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 徐帅 中级黑马   /  2013-1-12 12:32  /  2403 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 张向辉 于 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. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
高境 + 1 神马都是浮云

查看全部评分

2 个回复

倒序浏览
没人回答啊,自己顶起来
回复 使用道具 举报
我觉得就这个例子 想通过代理获得目标类  估计不大可能  除非在invoke方法中将目标传出去   但这样做代理就失去意义了  
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马