2

このエラーが発生しました:

java.lang.VerifyError: Bad <init> method call in method FooBar.<init>(I)V at offset 2
    at java.lang.Class.getDeclaredConstructors0(Native Method)
    at java.lang.Class.privateGetDeclaredConstructors(Class.java:2404)
    at java.lang.Class.getConstructor0(Class.java:2714)
    at java.lang.Class.getDeclaredConstructor(Class.java:2002)

ASM 4.0で変更したクラスのコンストラクターにアクセスしようとしたとき(jdk7を使用)。

クラスの初期化メソッドのバイトコードを確認しましたが、次のとおりです。

aload_0
iload_1
invokespecial com/foo/F/<init>(I)V
return

バイトコードを逆コンパイルすると、次のようになります。

import com.foo.Foo;

public class FooBar extends Foo
{
  public FooBar(int i)
  {
    super(i);
  }
}

なぜこのエラーが発生するのか、私は完全に困惑しています。十分な情報を提供したかどうかはわかりません。さらに情報を追加できるかどうか教えてください。

編集:コンストラクターにアクセスしているコードは次のとおりです。

Class fooBarClass = /* define class from class file bytes */;
Constructor fooBarConstructor = fooBarClass.getDeclaredConstructor(int.class);

EDIT2:クラスFooのコードは次のとおりです。

public class Foo extends F {

    public Foo(int i) {
        super(i);
    }
}
4

2 に答える 2

2

クラスFooを逆コンパイルして、適切なコンストラクターを監視してください。私の賭けはコンストラクターFoo(int)が存在しないことです。

于 2012-07-23T17:53:48.957 に答える
1

クラスFooBarのコンストラクターで呼び出されているメソッドは、実際にはクラスFのメソッドであり、クラスFooではないため、VerifyErrorがスローされています。

クラスFooBarのスーパーメソッドへの定数プール参照は、間違ったクラス(つまり、FooではなくF)に対するものでした。このため、VerifyErrorは、対応するメッセージ「Badmethodcall」とともにスローされます。

于 2012-07-26T03:21:43.533 に答える