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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

高照

中级黑马

  • 黑马币:0

  • 帖子:23

  • 精华:0

© 高照 中级黑马   /  2012-9-28 22:10  /  1458 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文


Object proxy3 = Proxy.newProxyInstance(
                                new Class[]{Collection.class},
                                new InvocationHandler(){
                                ArrayList target=new ArrayList();
                                        public Object invoke(Object proxy, Method method, Object[] args)
                                                        throws Throwable {

                                                long beginTime = System.currentTimeMillis();
                                                Object retVal = method.invoke(target, args);
                                                long endTime = System.currentTimeMillis();
                                                System.out.println(method.getName() + " running time of " + (endTime - beginTime));
                                                return retVal;               
                                               
                                        }
                                }
                                );
                proxy3.add("zxx");
                proxy3.add("lhm");
                proxy3.add("bxd");
                System.out.println(proxy3.size());


        首先InvocationHandler的作用是什么?
        其次Object retVal = method.invoke(target, args);  retVal类型到底是什么?
        还有就是proxy3.size()的值是和Collection.size()还是ArrayList target.size()一致?

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1 赞一个!

查看全部评分

3 个回复

倒序浏览
本帖最后由 叶征东 于 2012-9-29 00:10 编辑

我试着回答下,
(1),对于客户端程序,调用代理的方法涉及到三个要素,调用哪个对象,调用对象的哪个方法,给方法传了什么参数,代理对象的方法将这三个要素传给InvocationHandler的invoke()方法.如图:

然后执行invoke()方法.
(2),retVal类型到底是什么?
我觉得是要看你调用的是什么方法而定,被代理的类中有很多方法,不同的方法有不同的返回值类型,所以,因为返回值的类型不能确定,才用Object来定义retVal
这个我也不太肯定是这样的,可以在代码的最后加上System.out.println(proxy3.isEmpty());来验证.
(3)代理类的方法通常除了要调用目标类相应的方法和对外返回目标方法的返回值外,还可以在目标方法的前后,处理异常的catch语句中加上系统功能代码.

我是这样理解的
long beginTime = System.currentTimeMillis();
Object retVal = method.invoke(target, args);
long endTime = System.currentTimeMillis();//------如果这里的代码是对retVal进行运算呢?  retVal 的值是不是会改变?
System.out.println(method.getName() + " running time of " + (endTime - beginTime));
return retVal;

所以我认为,proxy3.size()的值与Collection.size(),   ArrayList target.size()可能是不一样的,
但是在你的代码中是一样的

回答得只能这样了,也不知道错了没有,如果错了,也请原谅.     呵



评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1 赞一个!

查看全部评分

回复 使用道具 举报
我难得打字,建议你重看下张老师的视频教程。
回复 使用道具 举报
上面用到的Collection和ArrayList target=new ArrayList();
必须都是集合类或子父类吗?
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马