Подтвердить что ты не робот

Почему кеш ClassLoader проверяется в порядке возрастания?

Почему кеш ClassLoader проверяется в восходящей последовательности, а загрузка классов - в нисходящей последовательности? Схема делегирования загрузчиков классов

4b9b3361

Ответ 1

ClassLoader в Java работает по трем принципу: делегирование, видимость и уникальность. Принцип делегирования - запрос запроса загрузки класса на загрузчик родительского класса и загружает только класс, если родитель не может найти или загрузить класс. Принцип видимости позволяет загрузчику дочерних классов видеть все классы, загруженные родительским ClassLoader, но загрузчик родительского класса не может видеть классы, загруженные дочерним. Принцип единственности позволяет загружать класс ровно один раз, что в основном достигается путем делегирования и гарантирует, что дочерний класс ClassLoader не перезагрузит класс, уже загруженный родителем.

Другими словами, как описано здесь:

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

  • Cache
    • Родитель
    • Самосовершенствование

Этот механизм обеспечивает загрузку классов, загружаемых загрузчиками классов, ближайшими к корню.

Ответ 2

Это чисто вопрос эффективности. Если вы забудете о кеше, порядок загрузки классов гарантирует, что системные классы Java всегда имеют приоритет над классами приложений и что класс может быть загружен только одним загрузчиком классов в цепочке. Таким образом, нет класса, который находится в более чем одном кеше, поэтому порядок поиска кешей не имеет функциональных отличий.

Другими словами, вы можете выполнить поиск в кэше загрузчика, за которым следует кеш загрузчика класса расширения, за которым следует кеш системного загрузчика, а затем начать загрузку классов, и конечный результат будет таким же. Для этого потребуется дополнительный API для поиска загруженного класса и принесет мало пользы, так как поиск в кеше - очень быстрая операция.

Обратите внимание, что классы могут быть загружены более чем одним загрузчиком классов, но не в том случае, если они находятся в цепочке загрузчика- > родителя.