Что такое Classloader и как он работает
Classloader (загрузчик классов) — это компонент JRE, который динамически загружает Java-классы в JVM по требованию. Класс с данным именем может быть загружен только один раз конкретным загрузчиком.
Аналогия из жизни: загрузчик классов работает как библиотечная система. Когда программе нужен класс, она обращается к загрузчику. Тот сначала спрашивает у вышестоящего загрузчика (как запрос в центральную библиотеку), и только если тот не нашёл — ищет сам. Это принцип делегирования.
Иерархия загрузчиков
При запуске JVM используются три загрузчика классов:
| Загрузчик | Что загружает | Расположение |
|---|---|---|
| Bootstrap class loader | Ядро Java (java.lang, java.util) | <JAVA_HOME>/jre/lib |
| Platform class loader (Extensions до Java 9) | Модули платформы (не из java.base) | В Java 9+ — модули JPMS |
| System (Application) class loader | Классы приложения | CLASSPATH (java.class.path) |
Начиная с Java 9, Extensions class loader заменён на Platform class loader (ClassLoader.getPlatformClassLoader()). Механизм расширений (java.ext.dirs) удалён в связи с введением модульной системы JPMS.
Три этапа загрузки класса
- Загрузка (Loading) — поиск и импорт двоичных данных класса
- Связывание (Linking):
- Проверка (Verification) — проверка корректности байт-кода
- Подготовка (Preparation) — выделение памяти для статических полей и инициализация значениями по умолчанию
- Разрешение (Resolution) — преобразование символических ссылок в прямые
- Инициализация (Initialization) — выполнение статических инициализаторов и блоков
static {}
Пользовательский загрузчик классов
Загрузчик классов написан на Java, поэтому можно создать собственный, унаследовав ClassLoader. Это позволяет:
- Загружать или выгружать классы во время выполнения (динамическая загрузка из HTTP-ресурсов)
- Изменять способ загрузки байт-кода (загрузка зашифрованного байт-кода)
- Модифицировать загруженный байт-код (аспектно-ориентированное программирование)
На собеседовании: ключевые моменты — принцип делегирования (дочерний загрузчик сначала просит родителя), три этапа (загрузка, связывание, инициализация), и три стандартных загрузчика. Не забудьте упомянуть, что с Java 9 Extensions заменён на Platform class loader.