Что такое Classloader
Загрузчик классов является частью JRE, которая динамически загружает Java классы в JVM. Обычно классы загружаются только по запросу. Система исполнения в Java не должна знать о файлах и файловых системах благодаря загрузчику классов. Делегирование является важной концепцией, которую выполняет загрузчик. Загрузчик классов отвечает за поиск библиотек, чтение их содержимого и загрузку классов, содержащихся в библиотеках. Эта загрузка обычно выполняется «по требованию», поскольку она не происходит до тех пор, пока программа не вызовет класс. Класс с именем может быть загружен только один раз данным загрузчиком классов.
При запуске JVM, используются три загрузчика классов:
- Bootstrap class loader (Загрузчик класса Bootstrap)
- Extensions class loader (Загрузчик класса расширений)
- System class loader (Системный загрузчик классов)
Загрузчик класса Bootstrap загружает основные библиотеки Java, расположенные в папке <JAVA_HOME>/jre/lib
. Этот загрузчик является частью ядра JVM, написан на нативном коде.
Загрузчик класса расширений загружает код в каталоги расширений (<JAVA_HOME>/jre/lib/ext
, или любой другой каталог, указанный системным свойством java.ext.dirs
).
Системный загрузчик загружает код, найденный в java.class.path
, который сопоставляется с переменной среды CLASSPATH
. Это реализуется классом sun.misc.Launcher$AppClassLoader
.
Загрузчик классов выполняет три основных действия в строгом порядке:
- Загрузка: находит и импортирует двоичные данные для типа.
- Связывание: выполняет проверку, подготовку и (необязательно) разрешение.
- Проверка: обеспечивает правильность импортируемого типа.
- Подготовка: выделяет память для переменных класса и инициализация памяти значениями по умолчанию.
- Разрешение: преобразует символические ссылки из типа в прямые ссылки.
- Инициализация: вызывает код Java, который инициализирует переменные класса их правильными начальными значениями.
Пользовательский загрузчик классов
Загрузчик классов написан на Java. Поэтому возможно создать свой собственный загрузчик классов, не понимая тонких деталей JVM. У каждого загрузчика классов Java есть родительский загрузчик классов, определенный при создании экземпляра нового загрузчика классов или в качестве системного загрузчика классов по умолчанию для виртуальной машины.
Что делает возможным следующее:
- загружать или выгружать классы во время выполнения (например, динамически загружать библиотеки во время выполнения, даже из ресурса HTTP). Это важная особенность для:
- реализация скриптовых языков;
- использование bean builders;
- добавить пользовательское расширение;
- позволяя нескольким пространствам имен общаться. Например, это одна из основ протоколов CORBA / RMI;
- изменить способ загрузки байт-кода (например, можно использовать зашифрованный байт-код класса Java);
- модифицировать загруженный байт-код (например, для переплетения аспектов во время загрузки при использовании аспектно-ориентированного программирования);
Oct. 23, 2023, Источник