Как диагностировать и исправить MissingMethodException в Java?

«Как диагностировать и исправить MissingMethodException в Java?» — вопрос из категории Java Core, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Алгоритм диагностики:

  1. Анализ сигнатуры метода:

    • Проверить точное соответствие имени, типам и порядку параметров, а также возвращаемому типу. Ошибка часто возникает из-за несовместимости версий библиотек.
      // Вызов:
      service.process("data", 100);
      // Реализация в новой версии библиотеки:
      public void process(String data, long timeout) { ... } // int -> long
  2. Проверка версий зависимостей:

    • Убедиться, что все модули проекта используют одну и ту же совместимую версию библиотеки, содержащей нужный класс. Использовать mvn dependency:tree для анализа.
  3. Проблемы с загрузкой классов (ClassLoader):

    • В серверных приложениях (Tomcat, OSGi) разные класслоадеры могут загрузить разные версии одного класса. Изучить стектрейс для определения источника загрузки класса.
  4. Обфускация/минификация (ProGuard, R8):

    • Проверить правила (-keep), чтобы критические методы и их сигнатуры не были переименованы или удалены.
  5. Динамическое проксирование (Spring AOP, AspectJ):

    • Если исключение возникает при вызове метода на прокси-объекте, убедиться, что метод не final и не private, иначе он не может быть проксирован.

Быстрое решение:

  • Внимательно изучить стектрейс: в нем указан конкретный класс и сигнатура отсутствующего метода.
  • Сравнить ее с фактическим API класса, используя javap или исходный код.