0Pricing
Java Academy · Урок

Этапы загрузки классов: загрузка, связывание, инициализация

Проследите за загрузкой, проверкой, подготовкой, разрешением и инициализацией классов.

«Этапы загрузки классов: загрузка, связывание, инициализация» — бесплатный урок Java Academy на CoddyKit. Это урок 1 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Java Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Java Academy содержит 4 уроков всего.

Жизненный цикл загрузки классов

Класс Java проходит три этапа, прежде чем его можно использовать: загрузка (поиск и чтение байт-кода), связывание (проверка, подготовка, разрешение) и инициализация (выполнение статических инициализаторов).

Этап 1: загрузка

ClassLoader считывает файл .class (из файловой системы, JAR, сети или созданного байт-кода) и создаёт в куче объект Class<?>, представляющий этот класс.

// Trigger loading explicitly:
Class<?> c = Class.forName("com.example.MyService");
// The JVM delegates to the appropriate ClassLoader to find and load MyService.class

Этап 2a: проверка

Проверяющее устройство байт-кода убеждается, что загруженный байт-код структурно корректен, безопасен с точки зрения типов и соответствует правилам спецификации JVM. Некорректный байт-код (например, неправильно изменённый с помощью ASM) вызывает VerifyError.

Этап 2b: подготовка

JVM выделяет память для статических полей и устанавливает для них значения по умолчанию (0, false, null). На этом этапе статические инициализаторы ещё НЕ выполнялись.

public class Config {
    static int timeout = 30;    // after preparation: timeout = 0 (default)
    static String host = "db"; // after preparation: host = null
    // Both get their real values only after Initialization
}

Этап 2c: разрешение

Символические ссылки (имена классов, сигнатуры методов) в пуле констант заменяются прямыми ссылками (указателями) на фактические классы и методы. Разрешение может быть отложено (ленивое разрешение).

Этап 3: инициализация

Статические инициализаторы (блоки static {}) и присваивания статическим полям выполняются в текстовом порядке. Именно на этом этапе фактически выполняются timeout = 30 и host = "db".

public class Config {
    static int timeout;
    static String host;
    static {
        timeout = Integer.parseInt(System.getenv("TIMEOUT"));
        host    = System.getenv("DB_HOST");
        System.out.println("Config initialized");
    }
}

Триггеры инициализации класса

Инициализация запускается при первом: (1) создании экземпляра, (2) обращении к статическому полю (не константному), (3) вызове статического метода, (4) обращении через рефлексию с помощью Class.forName() (с параметром initialize=true), (5) инициализации подкласса.

// forName with initialize=false skips static initializers:
Class<?> c = Class.forName("com.example.MyService", false, loader);

Метод <clinit>

JVM генерирует метод <clinit> (инициализатор класса) из всех статических инициализаторов и присваиваний статическим полям. Он выполняется ровно один раз и является потокобезопасным — JVM гарантирует взаимное исключение.

ExceptionInInitializerError

Если статический инициализатор выбрасывает исключение, JVM оборачивает его в ExceptionInInitializerError. Последующие попытки использовать класс приводят к исключению NoClassDefFoundError.

static {
    if (System.getenv("DB_URL") == null)
        throw new RuntimeException("DB_URL not set"); // wrapped in ExceptionInInitializerError
}

Порядок статической инициализации

Статические инициализаторы выполняются в текстовом порядке. Циклические зависимости классов во время инициализации могут привести к частично инициализированным классам — это известный подводный камень шаблона инициализации по требованию через держатель.

class A {
    static final int X = B.Y + 1; // accesses B before B is initialized!
}
class B {
    static final int Y = A.X + 1; // circular!
}

Наблюдение за загрузкой классов

Включите вывод журнала загрузки классов с помощью -Xlog:class+load=info (JVM 9+), чтобы увидеть, какие классы загружаются, откуда и каким ClassLoader.

// JVM flag:
// java -Xlog:class+load=info:file=classload.log MyApp
// Output lines like:
// [info][class,load] com.example.MyService source: file:///app/app.jar

Быстрая проверка

На каком этапе выполняются статические инициализаторы?

Итоги

Загрузка: чтение байт-кода. Связывание: проверка → подготовка (нулевые значения по умолчанию) → разрешение (символические ссылки). Инициализация: выполнение <clinit>. Инициализация запускается при первом использовании и является потокобезопасной. Циклические зависимости во время инициализации приводят к трудноуловимым ошибкам.

Часто задаваемые вопросы

Урок «Этапы загрузки классов: загрузка, связывание, инициализация» бесплатный?

Да — полный текст урока «Этапы загрузки классов: загрузка, связывание, инициализация» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Java Academy, подпишись на CoddyKit PRO. Курс Java Academy содержит 4 уроков всего.

Чему я научусь в уроке «Этапы загрузки классов: загрузка, связывание, инициализация»?

Проследите за загрузкой, проверкой, подготовкой, разрешением и инициализацией классов. Ты практикуешь Java Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Java Academy?

Предыдущий опыт не требуется. Java Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 1 из 4.

Сколько времени занимает урок «Этапы загрузки классов: загрузка, связывание, инициализация»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Java Academy?

Да. Каждый урок Java Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Этапы загрузки классов: загрузка, связывание, инициализация
  2. Иерархия ClassLoader и пользовательские загрузчики
  3. Просмотр байткода с помощью javap
  4. JIT-компиляция и многоуровневая компиляция
← Назад к Java Academy