线程" main"中的Javap异常java.lang.NoSuchMethodError

时间:2016-01-13 11:12:53

标签: java

我有一个抛出此异常的旧类。

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机器上代码级别扩展不起作用:)?

1 个答案:

答案 0 :(得分:0)

每个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的变量use是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