Один и тот же по имени класс загружен двумя разными загрузчиками. Что произойдёт при попытке присвоить объект одного типа переменной другого?
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?
- Как это свойство используют серверы приложений?
Разбор темы
- Загрузка классов и class loaders
Жизненный цикл класса (loading/linking/initialization), иерархия загрузчиков с делегированием, триггеры инициализации и изоляция.
Связанные вопросы
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.