Ответ 1
ClassLoader в Java работает по трем принципу: делегирование, видимость и уникальность. Принцип делегирования - запрос запроса загрузки класса на загрузчик родительского класса и загружает только класс, если родитель не может найти или загрузить класс. Принцип видимости позволяет загрузчику дочерних классов видеть все классы, загруженные родительским ClassLoader, но загрузчик родительского класса не может видеть классы, загруженные дочерним. Принцип единственности позволяет загружать класс ровно один раз, что в основном достигается путем делегирования и гарантирует, что дочерний класс ClassLoader не перезагрузит класс, уже загруженный родителем.
Другими словами, как описано здесь:
Погрузчики классов в Java организованы в дерево. По запросу класс loader определяет, был ли класс уже загружен в прошлом, глядя в свой собственный кеш. Если класс присутствует в кеше, CL возвращает класс, если нет, он делегирует запрос родительскому элементу. Если родительский элемент не установлен (является Null) или не может загрузить класс и бросает ClassNotFoundException, загрузчик классов пытается загрузить класса и ищет свой собственный путь для файла класса. Если класс может быть загружен, он возвращается, иначе ClassNotFoundException бросается. Поиск в кэше происходит рекурсивно с parent, пока не будет достигнут корень дерева или не будет найден класс в кеше.Если корень достигнут, загрузчики классов попытаются загрузить класс и разверните рекурсию от родителя к дочерней. Подводя итог тому, что мы имеем в следующем порядке:
- Cache
- Родитель
- Самосовершенствование
Этот механизм обеспечивает загрузку классов, загружаемых загрузчиками классов, ближайшими к корню.