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