本帖最后由 张向辉 于 2013-1-29 11:12 编辑
问题:
System.out.println(proxy3.getClass().getName());
当一个代理类调用invoke方法,去执行目标,目标的getClass().getName()应该返回ArrayList,但结果却为Proxy0.。
视频中张老师解释的原因为:
只有HashCode,equals和toString方法才委托给handler,即自动调用invoke方法,其他方法有自己的实现。
我对于张老师的解释太理解,System.out.println(proxy3.getClass().getName()); 这条语句不是调用到了toString方法么?
按照老师的解释是该代理类并没有委托给handler,也就是说没有调用invoke方法,所以打印结果为Proxy0。
还有就是既然proxy3.getClass().getName()获取不到目标类的名称,那有什么方法可以得到呢,即得到ArrayList。
下面是代码,希望大家帮忙解答,谢谢喽- package cn.xushuai.test;
- import java.lang.reflect.Constructor;
- import java.lang.reflect.InvocationHandler;
- import java.lang.reflect.InvocationTargetException;
- import java.lang.reflect.Method;
- import java.lang.reflect.Proxy;
- import java.util.ArrayList;
- import java.util.Collection;
- public class ProxyTest3 {
- public static void main(String[] args) throws SecurityException, NoSuchMethodException, IllegalArgumentException, InstantiationException, IllegalAccessException, InvocationTargetException {
- //使用Proxy类的newProxyInstance方法直接获取字节码和实例对象
- //指定一个目标
-
- Collection proxy3 = (Collection)Proxy.newProxyInstance(
- Collection.class.getClassLoader(),
- new Class[]{Collection.class},
- new InvocationHandler(){
-
- @Override
- public Object invoke(Object proxy, Method method,Object[] args) throws Throwable {
-
- ArrayList target = new ArrayList();
-
- //将系统功能抽取成为一个对象,通过接口方法调用,而不需知道内部的方法
- long beginTime = System.currentTimeMillis();
- //在目标对象身上去执行代理执行的方法,
- Object retVal = method.invoke(target, args);
- long endTime = System.currentTimeMillis();
- System.out.println("The running time of "+method.getName()+" method is "+(endTime-beginTime));
- return retVal;//目标方法将值返回给代理的方法,add方法的返回值就从代理方法的返回值上取
- }
- }
- );
- System.out.println(proxy3.getClass().getName());
- /*调用invoke方法,去执行目标,目标的getClass().getName()应该返回ArrayList,但结果却为Proxy0.。
- 原因:只有HashCode,equals和toString方法才委托给handler,即自动调用invoke 方法,其他方法有自己的实现。*/
- }
- }
复制代码 |