发生场景
组件开发现状:组件2依赖组件1
操作步骤 例:
- 组件1中A.java中的方法
public class A {
long getLong() {
return 1l;
}
}
组件2中B.java中的对组件1中的A的getLong的方法引用
public class B {
void print() {
System.out.print("the value is:" + new A().getLong());
}
public static void main(String[] args) {
new B().print();
}
}
- 现在修改组件1中的A方法返回值为大写Long
public class A {
Long getLong() {
return 1l;
}
}
-
现在对组件1进行发版,组件2却不发版 运行报错:Exception in thread "main" java.lang.NoSuchMethodError: com.yb.fanxtest.A.getLong()J。
-
模拟复现
- A.java 方法改变前;javac编译 A.java B.java。
- javap B 执行,正常打印:the value is:1
- A.java 方法返回值修改为Long后;javac编译 A.java
- 再次执行javap B 报错:Exception in thread "main" java.lang.NoSuchMethodError: com.yb.fanxtest.A.getLong()J。
原因探究
javap查看B.class,此时B.print()方法调用栈中写入的A的方法签名为:
com/yb/fanxtest/A.getLong:()J
而我们修改A.java后的A.getLong的方法签名为:
java/lang/Long.valueOf:(J)Ljava/lang/Long;
返回类型由基本类型变为了class类型,所以报在A.java中找不到方法错误。