Java.lang.NoSuchMethodError怎么解决,难道是方法名写错了吗?

摘要:问题现象 近期本人负责的一个SpringBoot模块出现了java.lang.NoSuchMethodError报错,问题情况如下: A类提供了setJumpType(String type),B类调用A类的setJumpType(Stri
问题现象 近期本人负责的一个SpringBoot模块出现了java.lang.NoSuchMethodError报错,问题情况如下: A类提供了setJumpType(String type),B类调用A类的setJumpType(String type)报错java.lang.NoSuchMethodError: com.xxx.A.setJumpType(Ljava/lang/String;)V 在之前的发版的程序中,B类无变更,出现以上问题后,重新编译B类问题解决。 常见该问题原因与解决方法 方法不存在:变更实现 方法签名变更(一般博客中只关注到方法名与参数列表):修正方法名与参数列表 问题分析 反编译代码和本地IDE源码调试均无该报错出现,方法是存在的 检查A类是否存在方法名称和参数类型、数量变更,发现也没问题 使用javap -v命令分析,经比较之前编译的与新编译的B类调用A类的方法签名中,返回值不同 处理方法 原因确定是方法签名的返回值发生变更 既然这个类是个DTO对象,就可以不直接用对方的DTO,重写一份放自己这边解决该问题,类似的情况只能靠发版前,在测试环境自测功能是否正常,有问题及时发现与解决 问题总结 java.lang.NoSuchMethodError错误出现于方法不存在和签名变更的情况 方法签名格式:类路径.方法名(参数列表;)返回值类型 返回值类型:void->V; 引用->L类路径; 方法签名中除了类路径变更会导致ClassNotFound异常外,(方法名、参数列表、返回值类型)发生变化都会引起NoSuchMethodError错误,可根据错误原因进行处理 编译的class文件中不仅包含自身源文件的编译结果,还包含引用的类与方法的签名信息,一旦签名发生变更就会出现兼容性问题,可能造成NoSuchMethodError错误。