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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 哈达洋 中级黑马   /  2014-9-17 18:56  /  3036 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

1黑马币
*******************************************部分程序****************************                 final ArrayList target = new ArrayList();
                Collection myProxy1 =(Collection) getProxy(target,new myAdvice());
                myProxy1.add("zhansan");
                myProxy1.add("lisi");
                myProxy1.add("wangwu");
                System.out.println("==========");
                System.out.println(myProxy1);
        }
        private static Object getProxy(final Object target,final Advice myAdvice) {
                Object myProxy1 = (Object)Proxy.newProxyInstance(
                                target.getClass().getClassLoader(),
                                target.getClass().getInterfaces(),
                                new InvocationHandler(){
                                       
                                        @Override
                                        public Object invoke(Object proxy, Method method,
                                                        Object[] args) throws Throwable {
                                                myAdvice.beforMethod();
                                                //System.out.println("=====");
                                                Object oo = method.invoke(target, args);
                                                System.out.println(target+"..."+oo);
                                                myAdvice.aferMethod();
                                                //System.out.println("-------");       
                                                return oo;
                                        }
                                });
                return myProxy1;
        }

************************************************运行结果*******************

hello,world
[zhansan]...true
bye,world
hello,world
[zhansan, lisi]...true
bye,world
hello,world
[zhansan, lisi, wangwu]...true
bye,world
==========
hello,world
[zhansan, lisi, wangwu]...[zhansan, lisi, wangwu]
bye,world
[zhansan, lisi, wangwu]

******************************疑问????***********************
System.out.println(myProxy1); 程序在执行这句话的时候,为什么还会调用InvocationHandler中的inovke方法???而不是直接打印存储在动态代理类里的最终结果??

最佳答案

查看完整内容

System.out.println(myProxy1);执行的是System.out.println(myProxy1.toString()); 执行动态代理类对象的toString()的话, 其是会调用invoke的. 执行动态代理类对象的Object类的hashCode, equals, toString时, 都会调用到invoke的. 而执行其它的Object中的方法, 是不会调用到invoke的.

1 个回复

倒序浏览
System.out.println(myProxy1);执行的是System.out.println(myProxy1.toString());
执行动态代理类对象的toString()的话, 其是会调用invoke的.
执行动态代理类对象的Object类的hashCode, equals, toString时, 都会调用到invoke的.
而执行其它的Object中的方法, 是不会调用到invoke的.
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马