Jump to content

Загрузчик классов Java

(Перенаправлено с Classloader )

Загрузчик классов Java , являющийся частью среды выполнения Java , динамически загружает классы Java в виртуальную машину Java . [1] Обычно классы загружаются только по требованию . Виртуальная машина загрузит только файлы классов, необходимые для выполнения программы. [2] Системе времени выполнения Java не требуется знать о файлах и файловых системах, поскольку это делегируется загрузчику классов.

Библиотека программного обеспечения представляет собой набор связанного объектного кода . В языке Java библиотеки обычно упаковываются в файлы JAR . Библиотеки могут содержать объекты разных типов. Наиболее важным типом объекта, содержащегося в файле Jar, является класс Java . Класс можно рассматривать как именованную единицу кода. Загрузчик классов отвечает за поиск библиотек, чтение их содержимого и загрузку классов, содержащихся в библиотеках. Эта загрузка обычно выполняется «по требованию», то есть она не происходит до тех пор, пока класс не будет вызван программой. Класс с заданным именем может быть загружен данным загрузчиком классов только один раз.

Каждый класс Java должен быть загружен загрузчиком классов. [3] [4] Более того, программы Java могут использовать внешние библиотеки (то есть библиотеки, написанные и предоставленные кем-то, кроме автора программы) или могут состоять, по крайней мере частично, из ряда библиотек.

При запуске JVM используются три загрузчика классов: [5] [6] [2]

  1. Загрузчик классов начальной загрузки
  2. Загрузчик классов расширений
  3. Загрузчик системных классов

Загрузчик классов начальной загрузки загружает основные библиотеки Java. [фн 1] расположен в <JAVA_HOME>/jre/lib (или <JAVA_HOME>/jmods> для Java 9 и выше). Этот загрузчик классов, являющийся частью ядра JVM, написан на собственном коде. Загрузчик классов начальной загрузки не связан ни с каким ClassLoader объект. [2] Например, StringBuilder.class.getClassLoader() возвращает null. [2]

Загрузчик классов расширений загружает код в каталоги расширений ( <JAVA_HOME>/jre/lib/ext, [5] или любой другой указанный каталог по java.ext.dirs системное свойство).

Загрузчик системных классов загружает код, найденный на java.class.path, который соответствует CLASSPATH переменная среды .

Пользовательские загрузчики классов

[ редактировать ]

Загрузчик классов Java написан на Java. Поэтому можно создать собственный загрузчик классов, не разбираясь в тонких деталях виртуальной машины Java. Помимо загрузчика классов Bootstrap, каждый загрузчик классов Java имеет загрузчик родительских классов. [7] Загрузчик родительских классов определяется при создании экземпляра нового загрузчика классов или при установке в качестве системного загрузчика классов по умолчанию виртуальной машины.

Это позволяет (например):

Классные погрузчики в Джакарте, EE

[ редактировать ]

Серверы приложений Jakarta EE (ранее Java EE и J2EE) обычно загружают классы из развернутого архива WAR или EAR с помощью дерева загрузчиков классов, изолируя приложение от других приложений, но разделяя классы между развернутыми модулями. Так называемые « контейнеры сервлетов » обычно реализуются в виде нескольких загрузчиков классов. [4] [9]

JAR-ад — это термин, похожий на DLL-ад, используемый для описания различных способов, при которых процесс загрузки классов может оказаться неработоспособным. [10] Три способа возникновения JAR-ада:

  • Случайное наличие двух разных версий библиотеки, установленных в системе. Система не будет считать это ошибкой. Скорее, система будет загружать классы из той или иной библиотеки. Добавление новой библиотеки в список доступных библиотек вместо ее замены может привести к тому, что приложение по-прежнему будет вести себя так, как будто используется старая библиотека, что вполне может быть.
  • Для нескольких библиотек или приложений требуются разные версии библиотеки foo . Если версии библиотеки foo используют одни и те же имена классов, невозможно загрузить версии библиотеки foo с одним и тем же загрузчиком классов.
  • Самые сложные проблемы JAR-ад возникают в обстоятельствах, когда используется вся сложность системы загрузки классов. Программа Java не обязана использовать только один «плоский» загрузчик классов, вместо этого она может состоять из нескольких (возможно, очень многих) вложенных взаимодействующих загрузчиков классов. Классы, загружаемые разными загрузчиками классов, могут взаимодействовать сложным образом, не до конца понятным разработчику, что приводит к ошибкам или ошибкам, которые трудно проанализировать, объяснить и устранить. [11]

Альянс OSGi определил (начиная с JSR 8 в 1998 году) широко распространенную структуру модульности, призванную решить ад JAR для текущих и будущих виртуальных машин в ME, SE и EE. JAR Используя метаданные в манифесте , файлы JAR (называемые пакетами) подключаются для каждого пакета отдельно. Пакеты могут экспортировать пакеты, импортировать пакеты и сохранять конфиденциальность пакетов, предоставляя базовые конструкции модульности и управления версиями зависимостей.

Чтобы исправить проблемы с JAR-адами, в 2005 году был инициирован процесс сообщества Java — JSR 277. Резолюция — Система модулей платформы Java — призвана представить новый формат распространения, схему управления версиями модулей и общий репозиторий модулей (аналогичный по назначению .NET Microsoft Глобальный кэш сборок ). В декабре 2008 года Sun объявила, что выпуск JSR 277 приостановлен. [12] Позже система модулей Java была перезагружена как «проект Jigsaw». [13] который был включен в Java 9 . Выпущенный в 2017 году, он включает поддержку модульного программного обеспечения, называемого «Система модулей платформы Java», которое контролируется на уровне исходного кода с помощью файлов модуля-info.java. Он следует философии, отличной от архитектуры OSGi, которая направлена ​​​​на обеспечение модульности среды выполнения Java обратно совместимым способом с использованием механизма загрузки классов по умолчанию, предоставляемого JRE. Однако, поскольку он не предлагает возможности контролируемого сосуществования библиотек разных версий, он не подходит для решения проблемы JAR-ад. [14]

См. также

[ редактировать ]
  1. ^ Эти библиотеки хранятся в файлах Jar с именами rt.jar , core.jar , server.jar и т. д.
  1. ^ Макманис, Чак (1 октября 1996 г.). «Основы загрузчиков классов Java» . JavaWorld . Проверено 13 июля 2020 г.
  2. ^ Jump up to: а б с д Хорстманн 2022 , §10.1.1 Процесс загрузки классов.
  3. ^ Хорстманн 2022 , §8.2.5 Запись байт-кодов в память.
  4. ^ Jump up to: а б Кристудас, Бинильдас (26 января 2005 г.). «Внутреннее устройство загрузки классов Java» . onjava.com . Архивировано из оригинала 10 мая 2018 г.
  5. ^ Jump up to: а б «Понимание загрузки классов расширения» . Учебники по Java. docs.oracle.com . Проверено 13 июля 2020 г.
  6. ^ Сосноски, Деннис (29 апреля 2003 г.). «Занятия и классная нагрузка» . IBM DeveloperWorks . Проверено 26 января 2008 г.
  7. ^ Horstmann 2022 , 10.1.2 Иерархия загрузчика классов.
  8. ^ Рубцов, Владимир (9 мая 2003 г.). «Взлом шифрования байт-кода Java» . JavaWorld . Проверено 13 июля 2020 г.
  9. ^ деБоер, Тим; Карасюк, Гэри (21 августа 2002 г.). «Загрузка классов J2EE раскрыта» . IBM DeveloperWorks . Проверено 26 января 2008 г.
  10. ^ «Депо — инкубатор Апачей» . Архивировано из оригинала 1 июня 2013 г.
  11. ^ «Таксономия проблем загрузчика классов с ведением журнала Jakarta Commons» .
  12. ^ Марк Рейнхольд (20 сентября 2010 г.). «Проект Головоломка» . Корпорация Оракл . Архивировано из оригинала 8 декабря 2015 г.
  13. ^ «Проект Головоломка» . Корпорация Оракл . Проверено 29 ноября 2015 г.
  14. ^ Бартлетт, Нил; Хакбарт, Кай (22 сентября 2016 г.). «Java 9, OSGi и будущее модульности (часть 1)» . ИнфоВ.
[ редактировать ]
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: f1ffca7992635c5410559ee9067f57f8__1712059860
URL1:https://arc.ask3.ru/arc/aa/f1/f8/f1ffca7992635c5410559ee9067f57f8.html
Заголовок, (Title) документа по адресу, URL1:
Java Classloader - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)