В чем уникальность модели загрузки классов в JVM?

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

Ответ

Модель загрузки классов в JVM уникальна благодаря делегирующей иерархии загрузчиков и изоляции пространств имен.

Ключевые особенности:

  1. Делегирование (Parent-first): Загрузчик классов не загружает класс сам, если только его родитель не смог этого сделать. Стандартная иерархия: Bootstrap → Platform/Extension → System/Application.
  2. Уникальность по имени и загрузчику: Класс идентифицируется не только полным именем (com.example.MyClass), но и его загрузчиком. Один и тот же класс, загруженный разными загрузчиками, считается разным типом в JVM.
  3. Ленивая загрузка (Lazy Loading): Классы загружаются только при первом использовании (при создании экземпляра, обращении к статическому полю и т.д.).
  4. Кэширование: Загрузчик кэширует загруженные классы, чтобы не загружать их повторно.

Пример изоляции пространств имен:

// Два разных загрузчика могут загрузить класс с одним именем
ClassLoader customLoader1 = new URLClassLoader(...);
ClassLoader customLoader2 = new URLClassLoader(...);

Class<?> class1 = customLoader1.loadClass("com.example.MyClass");
Class<?> class2 = customLoader2.loadClass("com.example.MyClass");

System.out.println(class1 == class2); // false — это разные классы для JVM

Практическое значение: Эта модель обеспечивает безопасность, позволяет запускать несколько версий библиотек одновременно (как в серверах приложений) и реализовывать горячее перезамещение кода.