Какова роль ClassLoader во время компиляции Java-программы?

«Какова роль ClassLoader во время компиляции Java-программы?» — вопрос из категории Java Core, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

ClassLoader не участвует в процессе компиляции. Его работа начинается во время выполнения программы (runtime).

Фазы работы с классом:

  1. Компиляция (compile-time): Компилятор javac преобразует .java исходники в .class файлы (байт-код). Проверяется синтаксис и статическая типизация.
  2. Загрузка (runtime): JVM с помощью ClassLoader выполняет:
    • Поиск .class файла по classpath.
    • Загрузку байт-кода в память.
    • Связывание (проверка, подготовка, разрешение символов).
    • Инициализацию (выполнение статических блоков).

Иерархия загрузчиков (на примере Java 11+):

Bootstrap ClassLoader (загружает core JDK классы: java.lang, java.util)
      ↑
Platform ClassLoader (загружает модули платформы)
      ↑
Application ClassLoader (загружает классы приложения из classpath)

Вывод: ClassLoader — это механизм динамической загрузки классов во время выполнения, а не часть компилятора.