我有一个抛出此异常的旧类。
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机器上代码级别扩展不起作用:)?
答案 0 :(得分:0)
每个Java方法都有一个签名,它还包含返回类型。
因此
com.SomeClass1.createEmail(Ljava/lang/String;)Lorg/apache/commons/mail/Email;
和
com.SomeClass2.createEmail(Ljava/lang/String;)Lcom/NewEmail;
是不同的。
可以使用继承,但这不会更改被调用方法的签名。所以,如果
然后调用新方法。
示例:
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