黑马程序员技术交流社区
标题:
获取动态代理类名称的疑问
[打印本页]
作者:
徐帅
时间:
2013-1-12 12:32
标题:
获取动态代理类名称的疑问
本帖最后由 张向辉 于 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 方法,其他方法有自己的实现。*/
}
}
复制代码
作者:
徐帅
时间:
2013-1-12 17:45
没人回答啊,自己顶起来
作者:
Rancho_Gump
时间:
2013-1-12 20:58
我觉得就这个例子 想通过代理获得目标类 估计不大可能 除非在invoke方法中将目标传出去 但这样做代理就失去意义了
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2