2016-01-13 42 views
0

我有引發此異常的舊類。線程「main」中的Javap異常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機器上代碼級別擴展是不行的:)?

+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衍生是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); 
    } 
} 

將打印出類似這樣

[email protected] 
相關問題