2016-01-13 2 views
0

У меня есть старый класс, который выдает это исключение.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 расширяет Email. Поэтому я предполагаю, что этот тип возврата является проблемой, хотя новый тип возвращаемого текста расширяет старый класс. Так что на 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] 
Смежные вопросы