黑马程序员技术交流社区

标题: 代理的handler内部类问题 [打印本页]

作者: H._张_♂    时间: 2014-4-2 19:00
标题: 代理的handler内部类问题
  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调用?

作者: Engle    时间: 2014-4-2 19:29
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,通过反射的方式调用你的被代理类要执行的方法。

作者: ehuashao    时间: 2014-4-2 19:33
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对象的方法。
作者: syusikoku    时间: 2014-4-2 21:07
这里不一样哦。这里是说要把传递过来的方法作用到哪个代码对象身上。并且这个方法在执行的时候的参数是什么。




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