黑马程序员技术交流社区

标题: 关于InvocationHandler里面参数的问题 [打印本页]

作者: 李挺    时间: 2013-2-23 10:13
标题: 关于InvocationHandler里面参数的问题
  1. public static Object getProxy(final Object target,final Advice myAdvice){
  2.                 Object proxy=Proxy.newProxyInstance(
  3.                                 target.getClass().getClassLoader(),
  4.                                 target.getClass().getInterfaces(),
  5.                                 new InvocationHandler() {
  6.                                         @Override
  7.                                         public Object invoke(Object proxy, Method method, Object[] args)
  8.                                                         throws Throwable {
  9.                                                 myAdvice.beginMethod();
  10.                                                 Object retVal=method.invoke(target, args);
  11.                                                 myAdvice.endMethod();
  12.                                                 return retVal;
  13.                                         }
  14.                                 });
  15.                 return proxy;
  16.         }
复制代码
上面是一个获得代理的函数,里面有个内部类叫做InvocationHandler
需要复写他的invoke()方法,注意到他需要传递一个Object proxy
可是这个Object proxy谁给的呢,他有没有用到这个参数啊


作者: 冯佩    时间: 2013-2-23 10:25
当你使用代理调用方法时,就会将使用的代理对象作为参数自动传入到invoke方法中了。
作者: 黑马刘杰    时间: 2013-2-23 10:29
我也很模糊,我认为,proxy是一个代理实例,谁调用这个方法,就传入谁的对象,这是我的理解。
作者: 铿锵科技    时间: 2013-2-23 10:30
本帖最后由 铿锵科技 于 2013-2-23 10:54 编辑

  public Object invoke(Object proxy, Method method, Object[] args)
                                                        throws Throwable {
                                                myAdvice.beginMethod();
                                                //proxy=target;                                                
                                               //Object retVal = method.invoke(proxy, args);
                                                Object retVal=method.invoke(target, args);//这句等于上面注释了的2句了
                                                myAdvice.endMethod();
                                                return retVal;
                                        }
需要复写他的invoke()方法,注意到他需要传递一个Object proxy
可是这个Object proxy谁给的呢,他有没有用到这个参数啊,有上面红色的就是Object proxy参数的对象了
作者: 逍林游    时间: 2013-2-23 10:30
invoke(Object obj,Method method,Object[] args),
这里的第一个参数obj其实可以看作没有用处的,不知道jdk为什么要把它也当作一个参数放这里,methd.invoke()方法,需要把原来的具体实现类作为参数传递进去,method.invoke(obj,args)相当于obj.method(args)

作者: 唐长智    时间: 2013-2-23 10:50
这是InvocationHandler的invoke方法的API文档:
Object invoke(Object proxy,
              Method method,
              Object[] args)
              throws Throwable
在代理实例上处理方法调用并返回结果。在与方法关联的代理实例上调用方法时,将在调用处理程序上调用此方法。
参数:
proxy - 在其上调用方法的代理实例
method - 对应于在代理实例上调用的接口方法的 Method 实例。Method 对象的声明类将是在其中声明方法的接口,该接口可以是代理类赖以继承方法的代理接口的超接口。
args - 包含传入代理实例上方法调用的参数值的对象数组,如果接口方法不使用参数,则为 null。基本类型的参数被包装在适当基本包装器类(如 java.lang.Integer 或 java.lang.Boolean)的实例中。

我理解的Object proxy就应该是Proxy.newProxyInstance()生成的代理实例proxy
作者: 李挺    时间: 2013-2-23 12:36
铿锵科技 发表于 2013-2-23 10:30
public Object invoke(Object proxy, Method method, Object[] args)
                                  ...

target是finnal的,没必要自己定义个参数接受他吧?直接用就是了
作者: 朱玉玺    时间: 2013-2-23 15:38
在invoke方法里边,加个打印语句,把proxy打印一下看看




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