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