Получить доступ

Один и тот же по имени класс загружен двумя разными загрузчиками. Что произойдёт при попытке присвоить объект одного типа переменной другого?

SeniorJVM и сборка мусора
Коротко

ClassCastException: тип в JVM — пара «полное имя + загрузчик», и одинаково названные классы из разных загрузчиков несовместимы. Отсюда абсурдное «Foo cannot be cast to Foo».

  • На этом построена изоляция плагинов и веб-приложений
  • Типичные причины: библиотека и в приложении, и в сервере; горячая перезагрузка (devtools)
  • Решение — общий тип в родительском загрузчике

А ещё Через интерфейс из общего загрузчика объекты передаются без проблем

Так подсказку видит пользователь sotto на живом собеседовании — за пару секунд, пока вы думаете вслух.

Подробно

На этом свойстве держится изоляция в серверах приложений и плагинных системах: два модуля могут использовать разные версии одной библиотеки, не конфликтуя. Обратная сторона — загадочные ошибки вида «ClassCastException: com.example.Foo cannot be cast to com.example.Foo», которые выглядят абсурдно, пока не вспомнишь про загрузчики. Заодно полезно развести два похожих сбоя: ClassNotFoundException — проверяемое исключение при попытке загрузить класс по имени, которого нет; NoClassDefFoundError — ошибка, возникающая, когда класс был доступен при компиляции, но отсутствует в рантайме, либо когда его статическая инициализация ранее провалилась.

Что хотят услышать

  • Идентичность класса.
  • Практические ситуации и решение.

Частые ошибки

  • Считать полное имя класса достаточным для идентичности типа.
  • Путать ClassNotFoundException и NoClassDefFoundError.

Проверьте себя

Один верный вариант. Подумайте, потом откройте ответ.

Показать варианты и ответ
  • ✓ClassCastException: идентичность класса в JVM определяется полным именем вместе с загрузчиком, поэтому это два разных типа
  • ✗Всё сработает: классы с одинаковым полным именем считаются одинаковыми
  • ✗Будет брошено ClassNotFoundException
  • ✗JVM автоматически выгрузит одну из версий класса

Что спросят дальше

  • Чем ClassNotFoundException отличается от NoClassDefFoundError?
  • Как это свойство используют серверы приложений?

Разбор темы

Связанные вопросы

Закрытая бета

Подсказки на собеседовании — в реальном времени

sotto слышит вопрос интервьюера и показывает короткий ответ и план, как в блоке «Коротко». Оставьте контакт — пришлём доступ и промокод.

  • Промокод на 2 часа — сверх пробных 30 минут
  • Программа для Windows — скачать сразу, войти — через Яндекс ID или VK ID
  • Прямая связь с разработчиком: что улучшить — сделаем