0

我正在开发一个在尝试new某个类时抛出 NoSuchMethodError 的应用程序。代码看起来像这样......

Bar bar = new Bar(Bar.Type.WHATEVER, 1f);

...错误是...

Caused by: java.lang.NoSuchMethodError: com.foo.Bar.<init>

我在网上看到的所有内容都与针对库的一个版本进行编译并使用没有相同方法/签名的另一个版本运行有关。但是,在我的情况下,有问题的类在一个 JAR 中,其类正在应用程序的 APK 中导出。所以不应该在运行时使用不同版本的类,对吧?

最近更改的构造函数参数,Bar因此我执行了以下操作来验证更改是否已进入 APK:

  1. 打开APK并提取classes.dex
  2. 使用 dex2jar 将 DEX 转换为 JAR
  3. 打开 JAR 并提取有问题的类。
  4. 使用 jclasslib 检查类并验证构造函数是否存在。我懂了<init>(Lcom/foo/Bar$Type;F)

在这一点上,我很困惑。有谁知道可能导致此错误的原因是什么?

4

1 回答 1

0

我让应用程序再次运行,我相信问题是项目使用的一个 jar,它是使用 Bar 的(现已过时的)版本构建的。假设我的应用程序依赖于 jar X(包括 Bar)和 Y(使用 Bar)。我知道 Bar 的签名最近发生了更改,并且我可以看到更改正在进入 APK。但我没有意识到jar Y 使用了 Bar 并且最近没有重建。由于抛出的异常只提到了方法名称—— <init>(构造函数)——而不是参数,我没有意识到 Bar 试图使用(现在不存在的)默认构造函数来构造。

于 2013-02-07T20:16:14.143 回答