2012-07-23 43 views
2

我收到此錯誤:錯誤<init>方法調用方法?

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); 
    } 
} 
+0

請發表樣本代碼如何訪問構造函數 – kosa 2012-07-23 14:56:56

+0

這可能有助於.. http://stackoverflow.com/questions/100107/reasons-of-getting-a-java-lang-verifyerror – Varun 2012-07-23 14:58:19

回答

0

正在拋出VerifyError,因爲在類FooBar的構造函數中調用的方法實際上是類F的方法而不是類Foo。

對FooBar類中super方法的常量池引用是錯誤的類(即F而不是Foo)。正因爲如此,VerifyError引發了相應的消息「Bad method call」。

2

嘗試反編譯類Foo並觀察適當的構造函數。我的賭注是構造函數Foo(int)不存在。

+0

Foo類有一個整型參數的構造函數,沒有其他參數。我會將這些信息添加到問題中。 – mburke13 2012-07-24 00:18:04