簡體   English   中英

線程“ main”中的Javap異常java.lang.NoSuchMethodError

[英]Javap Exception in thread “main” java.lang.NoSuchMethodError

我有舊類拋出此異常。

com.SomeClass.createEmail(Ljava/lang/String;)Lorg/apache/commons/mail/Email;

使用Cavaj對舊類進行反編譯后,我具有與當前文件相同的源代碼。 所以我反匯編了類,唯一的區別是返回類型。

舊:

127  invokevirtual com.SomeClass.createEmail(java.lang.String) : org.apache.commons.mail.Email [68]

新:

126  invokestatic com.SomeCalss.createEmail(java.lang.String) : com.NewEmail [68]

NewEmail正在擴展電子郵件。 因此,即使新的返回類型擴展了舊類,我也認為此返回類型是問題所在。 因此,在JVM機器代碼級別上擴展不起作用:)?

每個Java方法都有一個簽名,該簽名還包含返回類型。

從而

com.SomeClass1.createEmail(Ljava/lang/String;)Lorg/apache/commons/mail/Email;

com.SomeClass2.createEmail(Ljava/lang/String;)Lcom/NewEmail;

是不同的。

可以使用繼承,但這不會更改所調用方法的簽名。 因此,如果

  • someClass2派生自someClass1和
  • com.NewEmail源自org.apache.commons.mail.Email
  • 用於調用createEmail的變量是someClass2的一個實例

然后調用新方法。

例:

public class Mail {
}
public class NewMail extends Mail{
}
public class C1 {
    public Mail send() {
        return new Mail();
    }
}
public class C2 extends C1 {
    @Override
    public NewMail send() {
        return new NewMail();
    }
}
public class Main {
    public static void main(String[] args) {
        C1 c = new C2();
        Mail m = c.send();
        System.out.println(m);
    }
}

將打印類似

NewMail@64726693

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM