Когда JVM загружает класс?

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

Ответ

Класс загружается в память JVM при первом активном использовании (active use). Загрузку выполняет ClassLoader. Основные триггеры:

  1. Создание экземпляра: new MyClass().
  2. Обращение к статическому члену: чтение или запись статического поля, вызов статического метода (MyClass.STATIC_FIELD).
  3. Рефлексивный вызов: Class.forName("MyClass") или ClassLoader.loadClass("MyClass").
  4. Инициализация подкласса: загрузка дочернего класса вызывает загрузку родительского (если он еще не загружен).
  5. Объявление класса как запускного: класс, содержащий метод main(String[]), загружается при запуске приложения.

Процесс загрузки класса включает:

  1. Loading: Нахождение бинарного представления класса и создание объекта Class.
  2. Linking: Проверка (verification), подготовка (подготовка памяти для статических полей) и, опционально, разрешение (resolution) символьных ссылок.
  3. Initialization: Выполнение статических инициализаторов и инициализация статических полей.

Пример, демонстрирующий момент загрузки и инициализации:

class DemoClass {
    static {
        // Статический блок выполняется на этапе инициализации
        System.out.println("Статический блок: DemoClass загружен и инициализирован.");
    }
    static int VALUE = 42;
}

public class Main {
    public static void main(String[] args) throws Exception {
        System.out.println("До загрузки класса.");
        // Триггер загрузки: обращение к статическому полю
        int x = DemoClass.VALUE;
        System.out.println("После загрузки класса. VALUE = " + x);
    }
}

Вывод:

До загрузки класса.
Статический блок: DemoClass загружен и инициализирован.
После загрузки класса. VALUE = 42