Это компонент JVM, который отвечает за динамическую загрузку классов в память во время выполнения программы. В Java каждый класс должен быть загружен в память перед его использованием, и именно Classloader занимается этой задачей.
🚩Функции
🟠Загрузка классов
Classloader находит и загружает файлы классов (обычно с расширением
.class) в память.🟠Проверка классов
После загрузки Classloader проверяет байт-код класса для обеспечения его корректности и безопасности.
🟠Связывание классов
Classloader связывает загруженные классы, включая проверку ссылок и разрешение символов.
🟠Инициализация классов
Classloader инициализирует загруженные классы, вызывая их статические инициализаторы и инициализаторы переменных.
🚩Иерархия
🟠Bootstrap ClassLoader
Это базовый загрузчик классов, встроенный в JVM. Он загружает основные классы Java из файла
rt.jar, такие как классы из java.lang, java.util и других. Он реализован на нативном языке и является частью ядра JVM.🟠Extension ClassLoader (Platform ClassLoader)
Загружает классы из стандартных расширений Java, находящихся в директории
jre/lib/ext или другой директории, определенной системным параметром java.ext.dirs. Он сам загружается с помощью Bootstrap ClassLoader.🟠Application ClassLoader (System ClassLoader)
Загружает классы приложения из директории classpath. Обычно это директория, указанная в переменной окружения
CLASSPATH или параметре командной строки -cp. Это стандартный загрузчик классов, используемый для загрузки классов приложений и библиотек.public class Main {
public static void main(String[] args) {
ClassLoader classLoader = Main.class.getClassLoader();
System.out.println("ClassLoader: " + classLoader);
try {
Class<?> aClass = classLoader.loadClass("Example");
System.out.println("Class loaded: " + aClass.getName());
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}🟠Мы получаем Classloader, который загрузил класс
Main.🟠Мы используем этот Classloader для загрузки класса
Example динамически.🟠Если класс
Example не найден, выбрасывается исключение ClassNotFoundException.🚩Кастомные
Можно создавать собственные Classloader, расширяя класс
java.lang.ClassLoader, например, для и классов из нестандартных источников (например, из базы данных, сети или зашифрованных архивов).import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.nio.file.Files;
import java.nio.file.Paths;
public class CustomClassLoader extends ClassLoader {
@Override
public Class<?> findClass(String name) throws ClassNotFoundException {
try {
byte[] bytes = loadClassData(name);
return defineClass(name, bytes, 0, bytes.length);
} catch (IOException e) {
throw new ClassNotFoundException(name, e);
}
}
private byte[] loadClassData(String name) throws IOException {
String path = name.replace('.', '/') + ".class";
InputStream inputStream = Files.newInputStream(Paths.get(path));
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
int data;
while ((data = inputStream.read()) != -1) {
byteArrayOutputStream.write(data);
}
return byteArrayOutputStream.toByteArray();
}
}
🟠Мы расширяем
ClassLoader и переопределяем метод findClass.🟠Метод
loadClassData загружает данные класса из файла.🟠Метод
defineClass создает класс из байтового массива.Ставь 👍 и забирай 📚 Базу знаний