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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 王金科 于 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. }
复制代码
后面加注释的那句话,具体流程是怎么样子的?谁能给我详细说说?

评分

参与人数 1黑马币 +20 收起 理由
创出一片辉煌 + 20 赞一个!

查看全部评分

3 个回复

倒序浏览
流程其实张老师视频里面画的有,代理对象执行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就是你传给代理对象调用的方法的参数
回复 使用道具 举报
04.final ArrayList target = new ArrayList<>();     为这个动态类指定目标
05.Collection proxy4 = (Collection)getProxy(target,new MyAdvice());      创建代理对象
06.proxy4.add("asd");//这句话的具体流程是怎么样子的?      这句话就是调用你代理对象的add方法,向里面加入"asd"
回复 使用道具 举报
谢谢大家的慷慨解答
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马