Вопрос с собеседования · Java

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

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

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

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

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

Подробно

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

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

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

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

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

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

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

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

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

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

Разбор темы

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

Партнёр платформы

Разбор собеседования с sotto

После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.

Разбор собеседования