黑马程序员技术交流社区
标题:
关于InvocationHandler里面参数的问题
[打印本页]
作者:
李挺
时间:
2013-2-23 10:13
标题:
关于InvocationHandler里面参数的问题
public static Object getProxy(final Object target,final Advice myAdvice){
Object proxy=Proxy.newProxyInstance(
target.getClass().getClassLoader(),
target.getClass().getInterfaces(),
new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
myAdvice.beginMethod();
Object retVal=method.invoke(target, args);
myAdvice.endMethod();
return retVal;
}
});
return proxy;
}
复制代码
上面是一个获得代理的函数,里面有个内部类叫做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