黑马程序员技术交流社区

标题: 动态代理练习出现的问题,求解 [打印本页]

作者: 早知道    时间: 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