黑马程序员技术交流社区

标题: 关于代理中的getClass()显示问题 [打印本页]

作者: 早知道    时间: 2013-9-28 09:47
标题: 关于代理中的getClass()显示问题
今天做代理的练习,发现getClass()的显示没弄清楚。

  1. <P>public class Test14 {
  2. public static void main(String[] args) throws Exception {
  3.   Class clazzProxy = Proxy.getProxyClass(Collection.class.getClassLoader(), Collection.class);
  4.   
  5.   Constructor con =  clazzProxy.getConstructor(InvocationHandler.class);
  6.   
  7.   Collection obj = (Collection)con.newInstance(new InvocationHandler(){
  8.    private List target = new ArrayList();
  9.    @Override
  10.    public Object invoke(Object proxy, Method method, Object[] args)
  11.      throws Throwable {
  12.     // TODO Auto-generated method stub
  13.     return method.invoke(target, args);
  14.    }
  15.    
  16.   });
  17.   obj.add(1);
  18.   obj.add(2);
  19.   System.out.println(obj.size());//代理的调用最后都是由目标实现的
  20.   System.out.println(obj.getClass());//如果按上面的说法理解,这会得出ArrayList 但最后打印的是 class $$$$Proxy0</P>
  21. <P> }</P>
  22. <P>}</P>
复制代码
视频看了好几次,终于明白了。原来调用代理对象从Object类继承的方法时,除了hashCode,equals和toString方法会转发给InvocationHandler对象外,对于其他方法,则不转发调用请求。即getClass()是代理类自己实现的,应该是为了证明代理的存在。




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