黑马程序员技术交流社区

标题: 为什么调用ArrayList类的add方法?而代理对象也添加了元素? [打印本页]

作者: 念满    时间: 2013-1-31 17:43
标题: 为什么调用ArrayList类的add方法?而代理对象也添加了元素?
interface Advice {
void beforeMethod(Method method);
void afterMethod(Method method);
}

class MyAdvice implements Advice {
long beginTime=0;
public void afterMethod(Method method) {
  long endTime=System.currentTimeMillis();
  System.out.println(method.getName()+":"+"run"+":"+(endTime-beginTime));
}
public void beforeMethod(Method method) {
  long beginTime=System.currentTimeMillis();
}
}
//代理调试类主函数中有
final ArrayList target=new ArrayList ();
  Collection proxy4 = (Collection)getProxy(target,new MyAdvice());
  proxy4.add("x");
  proxy4.add("y");
  proxy4.add("z");
  System.out.println(proxy4.size());
  System.out.println(proxy4.getClass().getName());
//为什么调用目标方法?而代理类也有值
System.out.println(proxy4);//[x, y, z]
//代理测试类的一个方法次,此方法获得目标类的代理的方法
private static Object getProxy(final Object target,final Advice advice) {
  Object proxy4=(Object)Proxy.newProxyInstance(
    target.getClass().getClassLoader(),
    target.getClass().getInterfaces(),
    new InvocationHandler(){
     public Object invoke(Object proxy, Method method, Object[] args)
       throws Throwable {
      advice.beforeMethod(method);
      Object retVal=method.invoke(target, args);
      advice.afterMethod(method);
      return retVal;
      
     }
    });
  return proxy4;
}
}

//为什么调用目标方法?而代理类也有值
System.out.println(proxy4);//[x, y, z]
客服端调用代理各个方法时,把请求转发给InvocationHandler对象,分发给目标的各个方法,
add方法运行原理是
Boolean add(Object obj){
        handler.invoke(this, this.getClass().getMethod("add"), obj);
     }
但是我们查看invoke方法,发现并没有对代理类进行操作,那么打印System.out.println(proxy4)时候;
代理对象何时装了三个元素x,y,z?

作者: 谢毅    时间: 2013-1-31 18:17
代理之所以叫代理,就是它能处理目标类的某些功能,并对这些功能进行额外的系统功能绑定。代理本身是不具备功能体的,它只是把一个窗口与目标类的功能体联系了起来。
如代码所示:Object retVal=method.invoke(target, args);代理类的功能体其实还是目标类本身的功能体
而从原理来看:handler.invoke(this, this.getClass().getMethod("add"), obj);其中this指向的本类对象必定是实现了目标类的接口,那么在客户端调用的时候只要是符合这个接口的目标类,都可以将功能实现代理。




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