Я тоже сталкивался с этой ошибкой.
Моя проблема заключалась в том, что я изменил сигнатуру метода, что-то вроде
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, он не найдет такой метод, он выглядит так, как если бы он был удален и не изменен, и, следовательно, названная ошибка.
Надеюсь, это поможет.