黑马程序员技术交流社区

标题: [已解决]关于动态代理InvocationHandler的一点疑问。 [打印本页]

作者: 刘芮铭    时间: 2012-8-23 17:58
标题: [已解决]关于动态代理InvocationHandler的一点疑问。
本帖最后由 刘芮铭 于 2012-8-23 20:54 编辑

看了张孝祥老师的JAVA高新技术,里面的动态代理类InvocationHandler不是很好理解!
于是自己尝试编写一个动态代理,其中对于InvocationHandler接口实现的类中的invoke()方法疑问:

希望各位大侠能够帮忙解疑!

                                                                 红色部分的proxy到底有什么作用?为什么要传入这个参数?)
根据查阅JAVA API文档,可以看出 invoke(Object proxy,Method method,Object[] args);
                                                     (这个invoke方法到底在什么地方被调用了?如何被调用的?)




作者: 张立江    时间: 2012-8-23 19:13
invoke(Object proxy,Method method,Object[] args)
你要代理的是哪个类,调用类中的那个方法,方法中有哪些参数

实现了InvocationHandler就是为了调用其中的invoke方法,
它的情况和多线程中实现Runnable接口只为了实现run方法是同一个原理。
这是我的理解,希望能帮到你
作者: 朱烈葵    时间: 2012-8-23 20:50
我想啊,既然是代理吗,就拿张老师的案例来讲,传入是ArrayList这个目标是吧,那么就是说上面那个proxy指向ArrayList,也就是张立江说的对象。
作者: 刘芮铭    时间: 2012-8-23 20:52
张立江 发表于 2012-8-23 19:13
invoke(Object proxy,Method method,Object[] args)
你要代理的是哪个类,调用类中的那个方法,方法中有哪些 ...

谢谢你的回答
作者: 刘芮铭    时间: 2012-8-23 20:52
朱烈葵 发表于 2012-8-23 20:50
我想啊,既然是代理吗,就拿张老师的案例来讲,传入是ArrayList这个目标是吧,那么就是说上面那个proxy指向 ...

谢谢你的回答  呵呵
作者: 朱烈葵    时间: 2012-8-23 21:07
刘芮铭 发表于 2012-8-23 20:52
谢谢你的回答  呵呵

都是老朋友了,什么谢谢,再这样我生气了,哈哈
作者: 杨健yj    时间: 2012-8-23 21:19
我的理解是:

代理实例调用发法,他会把方法传出去,究竟要传到哪里?所以内部应该会有一个接受这个代理实例的调用,调用invoke(Object proxy,Method method,Object[] args);这个方法接着把那个代理付给Object proxy。这样就明确了我们的代理实例了,就可以动态代理了。比如

                Subject subject = (Subject) Proxy.newProxyInstance(classType
                                .getClassLoader(), realSubject.getClass().getInterfaces(),
                                handler);

                subject.request();
subject这个代理实例。当他调用方法时,内部就自动的会把subject赋值给Object proxy,接着就会调用invoke(Object proxy,Method method,Object[] args);
方法,就可以执行我们想做的了。
                                               




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