No method xxxx in classes xxxx / xxxx.dex

222 阅读1分钟

发生场景

组件开发现状:组件2依赖组件1
操作步骤  例:

  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. 现在修改组件1中的A方法返回值为大写Long
public class A {
    Long getLong() {
        return 1l;
    }
}
  1. 现在对组件1进行发版,组件2却不发版 运行报错:Exception in thread "main" java.lang.NoSuchMethodError: com.yb.fanxtest.A.getLong()J。

  2. 模拟复现

  • 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中找不到方法错误。