本帖最后由 叶征东 于 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()可能是不一样的,
但是在你的代码中是一样的
回答得只能这样了,也不知道错了没有,如果错了,也请原谅. 呵
|