Gymterview
junior

Что такое 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.

Три этапа загрузки класса

  1. Загрузка (Loading) — поиск и импорт двоичных данных класса
  2. Связывание (Linking):
    • Проверка (Verification) — проверка корректности байт-кода
    • Подготовка (Preparation) — выделение памяти для статических полей и инициализация значениями по умолчанию
    • Разрешение (Resolution) — преобразование символических ссылок в прямые
  3. Инициализация (Initialization) — выполнение статических инициализаторов и блоков static {}

Пользовательский загрузчик классов

Загрузчик классов написан на Java, поэтому можно создать собственный, унаследовав ClassLoader. Это позволяет:

  • Загружать или выгружать классы во время выполнения (динамическая загрузка из HTTP-ресурсов)
  • Изменять способ загрузки байт-кода (загрузка зашифрованного байт-кода)
  • Модифицировать загруженный байт-код (аспектно-ориентированное программирование)

На собеседовании: ключевые моменты — принцип делегирования (дочерний загрузчик сначала просит родителя), три этапа (загрузка, связывание, инициализация), и три стандартных загрузчика. Не забудьте упомянуть, что с Java 9 Extensions заменён на Platform class loader.