В JVM встроено как минимум три стандартных загрузчика:
🔘 Bootstrap – встроенная в JVM нативная реализация, родитель для всех остальных загрузчиков. Загружает
часть стандартных классов
java.*;
🔘 Platform – отвечает за загрузку стандартных классов Java-рантайма. До Java 9
назывался Extension и занимался загрузкой расширений. Гарантируется, что ему будут видны (но не факт что загружены непосредственно им) все стандартные классы Java SE и JDK;
🔘 System (
Application) – загружает классы из
classpath конкретного приложения;
Перед тем как загрузить класс,
ClassLoader проверит, не может ли это сделать его родитель. Если класс уже загружен, то загрузка не потребуется.
Иллюстрация смысла этой иерархии –
загрузчики web-сервера Apache Tomcat. Прикладной код каждого web-приложения работает на своем отдельном загрузчике изолированно от других приложений. Даже один и тот же класс-singleton у каждого приложения будет собственный. Системные классы и общие библиотеки при том грузятся их родительскими загрузчиками, только один раз для сервера.