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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 早知道 中级黑马   /  2013-9-28 09:47  /  1042 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

今天做代理的练习,发现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()是代理类自己实现的,应该是为了证明代理的存在。

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马