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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 刘芮铭 于 2012-8-23 20:54 编辑

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

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

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



评分

参与人数 1技术分 +1 收起 理由
张立江 + 1

查看全部评分

6 个回复

倒序浏览
invoke(Object proxy,Method method,Object[] args)
你要代理的是哪个类,调用类中的那个方法,方法中有哪些参数

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

谢谢你的回答
回复 使用道具 举报
朱烈葵 发表于 2012-8-23 20:50
我想啊,既然是代理吗,就拿张老师的案例来讲,传入是ArrayList这个目标是吧,那么就是说上面那个proxy指向 ...

谢谢你的回答  呵呵
回复 使用道具 举报
刘芮铭 发表于 2012-8-23 20:52
谢谢你的回答  呵呵

都是老朋友了,什么谢谢,再这样我生气了,哈哈
回复 使用道具 举报
我的理解是:

代理实例调用发法,他会把方法传出去,究竟要传到哪里?所以内部应该会有一个接受这个代理实例的调用,调用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);
方法,就可以执行我们想做的了。
                                               
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马