黑马程序员技术交流社区

标题: 对以下程序有点不解 [打印本页]

作者: 高照    时间: 2012-9-28 22:10
标题: 对以下程序有点不解

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()一致?

作者: 叶征东    时间: 2012-9-29 00:09
本帖最后由 叶征东 于 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()可能是不一样的,
但是在你的代码中是一样的

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




作者: 柳彬    时间: 2012-9-29 00:27
我难得打字,建议你重看下张老师的视频教程。
作者: 高照    时间: 2012-9-29 09:00
上面用到的Collection和ArrayList target=new ArrayList();
必须都是集合类或子父类吗?




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