Какую роль выполняет ClassLoader в Java?

«Какую роль выполняет ClassLoader в Java?» — вопрос из категории Java Core, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

ClassLoader — это компонент JRE, отвечающий за динамическую загрузку классов Java в память во время выполнения.

Основные функции:

  1. Загрузка: Преобразует байт-код из .class файлов или других источников в объекты типа java.lang.Class в куче (Heap).
  2. Связывание: Проверяет корректность байт-кода, выделяет память для статических полей и разрешает символьные ссылки.
  3. Инициализация: Выполняет статические инициализаторы и присваивает начальные значения статическим переменным.

Иерархия и делегирование: 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.