Ответ
Класс загружается в память JVM при первом активном использовании (active use). Загрузку выполняет ClassLoader. Основные триггеры:
- Создание экземпляра:
new MyClass(). - Обращение к статическому члену: чтение или запись статического поля, вызов статического метода (
MyClass.STATIC_FIELD). - Рефлексивный вызов:
Class.forName("MyClass")илиClassLoader.loadClass("MyClass"). - Инициализация подкласса: загрузка дочернего класса вызывает загрузку родительского (если он еще не загружен).
- Объявление класса как запускного: класс, содержащий метод
main(String[]), загружается при запуске приложения.
Процесс загрузки класса включает:
- Loading: Нахождение бинарного представления класса и создание объекта
Class. - Linking: Проверка (verification), подготовка (подготовка памяти для статических полей) и, опционально, разрешение (resolution) символьных ссылок.
- 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