// new method
protected String constructScalar(ScalarNode node) {
return node.getValue();
}
// old method
protected Object constructScalar(ScalarNode node) {
return node.getValue();
}
在一段旧程序里,调用的是 old method ,签名里的返回值类型是Object,而依赖库里的类是新的,只有 new method ,这时程序调用会报java.lang.NoSuchMethodError
,如何才能把新旧方法都给它塞进去,让旧程序也能正确调用。
编译器无法通过,字节码可以存在是因为
Java Source
与JVM
的语义不同造成的.解决类似问题的方式采用bridgeMethod
桥接方法解决两者的语义冲突.楼主最后一句话表明想把上述两个方法塞到一个类里面,既然楼主知道字节码存在两个方法,而编译器不通过.那么楼主所说的把两个方法塞一个类里
就是想在编译器里解决这个问题,那么这个问题就是无解的,因为这是Java
语义的规定,我们不可打破.不过从楼主的问题来看,我猜测是想根据一个if(condition)
来决定使用老版本的方法还是新版本的方法.基于reflect
的Class.getDeclaredMethod(String name,Class<?>...paramterTypes)
只能根据方法名和参数类型来获取执行方法,但是在当前的场景中显然是不满足的,因为还少一个判断条件,即return type
.当然你也可以使用getDeclaredMethod()
获取所有的Method
,不过还有一个更便捷的API
,即MethodHandles
.可以根据return type
更准确的获取JVM
认知的方法