默认构造方法对应的正确MethodType是什么?findConstructor调用抛出NoSuchMethodException求助
默认构造方法对应的正确MethodType是什么?findConstructor调用抛出NoSuchMethodException求助
嗨Jochen,我看了你的问题,你遇到的问题其实是对findConstructor所需的MethodType理解有点偏差啦!
你可能以为默认构造方法的MethodType是无参数且返回A类型,但实际上构造方法(也就是<init>方法)的返回类型是void,而不是类本身。JVM里构造方法的签名是()V(无参数,返回void),而不是你预想的()A,这就是为什么你传入的MethodType会导致找不到对应构造方法的原因。
你需要把MethodType改成指向void类型的无参数方法类型,正确的写法应该是这样:
// 正确的MethodType:无参数,返回void MethodType mt = MethodType.methodType(void.class); MethodHandle mh = lookup.findConstructor(A.class, mt);
为什么错误信息里会显示()A呢?因为你之前传入的MethodType让JVM去寻找一个返回A的<init>方法,但构造方法本身并不会返回实例类型——实例是在构造方法执行前就已经分配好内存的,构造方法只是负责初始化它,所以JVM自然找不到符合这个错误签名的方法,就抛出了NoSuchMethodException。
调整MethodType之后,应该就能正常匹配到你的默认构造方法了,试试看吧!
备注:内容来源于stack exchange,提问作者JochenW
相关产品推荐
相关产品推荐

