黑马程序员技术交流社区

标题: 关于动态代理,谁能详细说说一个具体流程,还是有些模糊 [打印本页]

作者: 王金科    时间: 2012-9-13 20:56
标题: 关于动态代理,谁能详细说说一个具体流程,还是有些模糊
本帖最后由 王金科 于 2012-9-14 01:00 编辑
  1. public class ProxyDemo {
  2. public static void main(String[] args) throws Exception{

  3. final ArrayList target = new ArrayList<>();
  4. Collection proxy4 = (Collection)getProxy(target,new MyAdvice());
  5. proxy4.add("asd");//这句话的具体流程是怎么样子的?
  6. proxy4.clear();
  7. System.out.println(String.class.getInterfaces());

  8. }

  9. private static Object getProxy(final Object target,final Advice advice) {
  10. Object proxy4 = Proxy.newProxyInstance(
  11. target.getClass().getClassLoader(),
  12. target.getClass().getInterfaces(),

  13. new InvocationHandler(){
  14. @Override
  15. public Object invoke(Object proxy, Method method, Object[] args)
  16. throws Throwable {

  17. advice.beforeMethod(method);

  18. Object retVal = method.invoke(target, args);

  19. advice.afterMethod(method);

  20. return retVal;

  21. }
  22. });
  23. return proxy4;
  24. }

  25. }
复制代码
后面加注释的那句话,具体流程是怎么样子的?谁能给我详细说说?
作者: 杨震    时间: 2012-9-13 21:46
流程其实张老师视频里面画的有,代理对象执行add方法,实际上等于效于执行了InvocationHandler里面的invoke方法,invoke(Object proxy, Method method, Object[] args)
并且此时invoke的三个参数proxy就是调用add方法的代理对象本身,Method就是add,args就是你传给add的参数"asd";
同理:执行clear方法的时候,也等效于执行了InvocationHandler里面的invoke方法,invoke(Object proxy, Method method, Object[] args),只是此时传入invokde的三个参数有变化,proxy没有变,仍然是代理对象本身;Method此时变成了clear;args仍然是你传给clear的参数,但此时clear没有参数,所以args也为空.

也就是讲,代理对象每调用一个方法,实际上是在调用invoke,只是调用不同的方法传入invoke的参数不同,但proxy永远是代理对象本身,Method就是代理对象调用的方法,args就是你传给代理对象调用的方法的参数
作者: 李菁    时间: 2012-9-13 23:17
04.final ArrayList target = new ArrayList<>();     为这个动态类指定目标
05.Collection proxy4 = (Collection)getProxy(target,new MyAdvice());      创建代理对象
06.proxy4.add("asd");//这句话的具体流程是怎么样子的?      这句话就是调用你代理对象的add方法,向里面加入"asd"
作者: 王金科    时间: 2012-9-14 00:59
谢谢大家的慷慨解答




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