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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© H._张_♂ 中级黑马   /  2014-4-2 19:00  /  1004 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. Collection proxy = (Collection)constructor.newInstance(new InvocationHandler(){
  2.                         ArrayList target = new ArrayList();
  3.                         @Override
  4.                         public Object invoke(Object proxy, Method method, Object[] args)
  5.                                         throws Throwable {
  6.                                 // TODO Auto-generated method stub
  7.                                 System.out.println("_________");
  8.                                 Object value = method.invoke(target,args);
  9.                                 System.out.println(target.toString());
  10.                                 return value;
  11.                                
  12.                         }
  13.                
  14.                 });
复制代码

这段代码是代理的内部类写法,对于这一句应该怎么理解?
Object value = method.invoke(target,args);
这个invoke方法不是handler的吗?为什么这里是对method调用?

评分

参与人数 1技术分 +1 收起 理由
菜小徐 + 1

查看全部评分

3 个回复

正序浏览
这里不一样哦。这里是说要把传递过来的方法作用到哪个代码对象身上。并且这个方法在执行的时候的参数是什么。
回复 使用道具 举报
invoke()方法是反射类Method的一个方法,给你段代码看看:
  1. Method methodCharAt = String.class.getMethod("charAt", int.class);
  2.                 methodCharAt.invoke(str, 1));
复制代码

第一句代码通过反射得到String类的charAt()方法,第二句代码通过用Method的对象来调用invoke()方法,实质上相当于这句代码str.charAt(1)的调用。
  1. public Object invoke(Object proxy, Method method, Object[] args)
  2.                                         throws Throwable {
  3.                                 // TODO Auto-generated method stub
  4.                                 System.out.println("_________");
  5.                                 Object value = method.invoke(target,args);
  6.                                 System.out.println(target.toString());
  7.                                 return value;
  8.                                 
  9.                         }
复制代码

你的这段代码,传进来一个method对象,一个object数组args[];的作用是来调用那个被反射到method对象的方法。

评分

参与人数 1技术分 +1 收起 理由
菜小徐 + 1

查看全部评分

回复 使用道具 举报
Java动态代理类位于java.lang.reflect包下,一般主要
涉及到以下两个类:
(1)Interface InvocationHandler:该接口中仅定义了
一个方法
– public object invoke(Object obj,Method method,
Object[] args)
在实际使用时,第一个参数obj一般是指代理类,
method是被代理的方法,args
为该方法的参数数组。
这个抽象方法在代理类中动态实现。
你的这个方法 Object value = method.invoke(target,args);
调用的不是hander的invoke();方法。
而是Method类中的invoke,通过反射的方式调用你的被代理类要执行的方法。

评分

参与人数 1技术分 +1 收起 理由
菜小徐 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马