黑马程序员技术交流社区
标题:
动态代理练习出现的问题,求解
[打印本页]
作者:
早知道
时间:
2013-9-12 13:09
标题:
动态代理练习出现的问题,求解
本帖最后由 早知道 于 2013-9-20 20:15 编辑
代码如下:
public class MyInvocationHandler implements InvocationHandler {
ArrayList target = new ArrayList();
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
// TODO Auto-generated method stub
long beginTime = System.currentTimeMillis();
Object retVal = method.invoke(target, args);
long endTime = System.currentTimeMillis();
long useTime = endTime-beginTime;
System.out.println(method.getName()+"time:"+useTime);
return retVal;
}
}
Class clazzProxy1 = Proxy.getProxyClass(Collection.class.getClassLoader(),Collection.class);
Constructor constructor = clazzProxy1.getConstructor(InvocationHandler.class);
// Constructor constructor = clazzProxy1.getClass().getConstructor(InvocationHandler.class);发现用这个方法的话会报错求解
Collection proxy1 = (Collection) constructor.newInstance(new MyInvocationHandler());
System.out.println(proxy1.getClass().getName());//不明白为什么不经过InvocationHandler的invoke方法
上面的报错提示:Exception in thread "main" java.lang.NoSuchMethodException: java.lang.Class.<init>(java.lang.reflect.InvocationHandler)
作者:
mo﹎雲℡
时间:
2013-9-12 13:39
// Constructor constructor = clazzProxy1.getClass().getConstructor(InvocationHandler.class);发现用这个方法的话会报错求解
说一说我的理解,希望对你有所帮助。
这句代码的意思你知道吗?clazzProxy1.getClass()获取的是字节码。
那么反射得到字节码的其他2种形式你知道吗?
1.类名.class
2.对象.getClass()
3.Class.forName(类名)
那么获得的是谁的字节码呢?获得的是类的字节码。
clazzProxy1.getClass()这段话你有重新获得了一个新的Proxy类的字节码。
所以说肯定会报错。
下面代码出现的错误,我想就不用多说了吧。
个人观点,大家还有什么观点请提出来。
作者:
2012
时间:
2013-9-12 15:19
// Constructor constructor = clazzProxy1.getClass().getConstructor(InvocationHandler.class);发现用这个方法的话会报错求解
这句话的意思是获取clasProxy1的构造方法,该构造方法必须是一个带参数的构造方法,其参数是class字节码。这里报错的原因是classProxy1这个类中没有提供这样的构造函数,所以错了。
这是通过反射的方式获取构造函数,其实不管是反射还是直接创建对象,都是一样的结果。都需要对应的构造函数。
希望对你有所帮助!
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2