Этапы загрузки классов: загрузка, связывание, инициализация
Проследите за загрузкой, проверкой, подготовкой, разрешением и инициализацией классов.
«Этапы загрузки классов: загрузка, связывание, инициализация» — бесплатный урок 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 — локальная установка не требуется.
Все уроки этого курса
- Этапы загрузки классов: загрузка, связывание, инициализация
- Иерархия ClassLoader и пользовательские загрузчики
- Просмотр байткода с помощью javap
- JIT-компиляция и многоуровневая компиляция