Я тоже столкнулся с этой ошибкой.
Моя проблема заключалась в том, что я изменил подпись метода, например
void invest(Currency money){...}
в
void invest(Euro money){...}
Этот метод был вызван из контекста, подобного
public static void main(String args[]) {
Bank myBank = new Bank();
Euro capital = new Euro();
myBank.invest(capital);
}
. Компилятор молчал в отношении предупреждений / ошибок, поскольку капитал - это как валюта, так и евро.
Проблема возникла из-за того, что я только скомпилировал класс, в котором был определен метод - Bank, но не класс, из которого вызывается метод, который содержит метод main ().
Эта проблема не является чем-то, с чем вы можете столкнуться слишком часто, так как чаще всего проект перестраивается вручную или автоматически запускается действие Build, вместо того, чтобы просто компилировать один модифицированный класс.
Мое заявление состояло в том, что я создал .jar, который должен был использоваться как исправление, которое не содержало App.class, поскольку это не было изменено. Мне было разумно не включать его, поскольку я сохранил наследование базового класса исходного аргумента.
Дело в том, что при компиляции класса полученный байт-код является видом static , другими словами, это hard-reference .
Оригинальный дизассемблированный байт-код (сгенерированный с помощью инструмента javap) выглядит следующим образом:
#7 = Methodref #2.#22 // Bank.invest:(LCurrency;)V
После того, как ClassLoader загружает новый скомпилированный Bank.class, он не найдет такого метода, он выглядит так, как будто он был удален и не изменен, поэтому именованная ошибка.
Надеюсь, это поможет.