Ответ
ClassLoader — это компонент JRE, отвечающий за динамическую загрузку классов Java в память во время выполнения.
Основные функции:
- Загрузка: Преобразует байт-код из
.classфайлов или других источников в объекты типаjava.lang.Classв куче (Heap). - Связывание: Проверяет корректность байт-кода, выделяет память для статических полей и разрешает символьные ссылки.
- Инициализация: Выполняет статические инициализаторы и присваивает начальные значения статическим переменным.
Иерархия и делегирование: ClassLoader'ы образуют иерархию родитель-потомок. При запросе на загрузку класса загрузчик сначала делегирует эту задачу своему родителю (принцип родительского делегирования).
- Bootstrap ClassLoader: Загружает核心 библиотеки Java (
rt.jar,java.*). - Extension ClassLoader: Загружает классы из
jre/lib/ext. - Application/System ClassLoader: Загружает классы из classpath приложения.
Практическое применение и пример: Используется для изоляции, hot deployment и загрузки классов из нестандартных источников.
// Пример создания кастомного ClassLoader'а
URL[] classpathUrls = new URL[]{new File("/path/to/my/jar.jar").toURI().toURL()};
URLClassLoader customClassLoader = new URLClassLoader(classpathUrls, ClassLoader.getSystemClassLoader().getParent());
// Загрузка класса
Class<?> loadedClass = customClassLoader.loadClass("com.example.MyPlugin");
Object instance = loadedClass.getDeclaredConstructor().newInstance();
Где используется:
- Веб-серверы (Tomcat, Jetty) для изоляции веб-приложений.
- Системы плагинов и модулей (OSGi).
- Инструменты hot-swap в IDE для перезагрузки кода без перезапуска JVM.