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


Из Википедии, бесплатной энциклопедии
  (Перенаправлено из Classloader )
Перейти к навигации Перейти к поиску

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

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

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

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

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

Загрузчик классов начальной загрузки загружает основные библиотеки Java [fn 1], расположенные в <JAVA_HOME>/jre/libкаталоге. Этот загрузчик классов, который является частью ядра JVM, написан в машинном коде.

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

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

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

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

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

  • для загрузки или выгрузки классов во время выполнения (например, для динамической загрузки библиотек во время выполнения, даже из ресурса HTTP ). Это важная функция для:
  • для изменения способа загрузки байт-кода (например, можно использовать зашифрованный байт-код класса Java [5] ).
  • для изменения загруженного байт-кода (например, для плетения аспектов во время загрузки при использовании аспектно-ориентированного программирования ).

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

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

JAR ад

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

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

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

Чтобы решить проблемы с адом JAR,  в 2005 году был инициирован процесс сообщества Java - JSR 277. Решение - Система модулей платформы Java  - предназначено для введения нового формата распространения, схемы управления версиями модулей и общего репозитория модулей (схожего по назначению с Microsoft .NET «s глобальный кэш сборок ). В декабре 2008 года Sun объявила о приостановке выпуска JSR 277. [9] Модульная система Java была позже перезагружена как «проект Jigsaw» [10], который был включен в Java 9 .

Смотрите также

  • Загрузчик (вычисления)
  • Динамическая загрузка
  • DLL ад
  • OSGi
  • Путь к классам (Java)
  • Модульная система платформы Java

Сноски

  1. ^ Эти библиотеки хранятся в Jar файлов , называемых rt.jar , core.jar , server.jar и т.д.

использованная литература

  1. ^ McManis, Chuck (1 октября 1996). «Основы загрузчиков классов Java» . JavaWorld . Проверено 13 июля 2020 .
  2. ^ a b Christudas, Binildas (26 января 2005 г.). «Внутреннее устройство загрузки классов Java» . onjava.com . Архивировано из оригинала на 2018-05-10.
  3. ^ a b «Понимание загрузки класса расширения» . Учебники по Java. docs.oracle.com . Проверено 13 июля 2020 .
  4. ^ Сосновский, Денис (29 апреля 2003). «Классы и загрузка классов» . IBM DeveloperWorks . Проверено 26 января 2008 .
  5. ^ Рубцов Владимир (9 мая 2003). «Взломать шифрование байтовым кодом Java» . JavaWorld . Проверено 13 июля 2020 .
  6. ^ ДеБоэр, Тим; Карасюк, Гэри (21 августа 2002 г.). «Демистификация загрузки класса J2EE» . IBM DeveloperWorks . Проверено 26 января 2008 .
  7. ^ https://web.archive.org/web/20130601002059/http://incubator.apache.org/depot/version/jar-hell.html
  8. ^ http://articles.qos.ch/classloader.html
  9. Марк Рейнхольд (20 сентября 2010 г.). «Проект Пазл» . Корпорация Oracle . Архивировано из оригинала на 2015-12-08.
  10. ^ "Проект Пазл" . Корпорация Oracle . Проверено 29 ноября 2015 .

внешние ссылки

  • Чак МакМанис, " Основы загрузчиков классов Java ", 1996 г.
  • Брэндон Э. Тейлор, " Загрузка классов Java: основы ", 2003 г.
  • Джефф Хэнсон, « Взять под контроль загрузку классов в Java », 2006-06-01
  • Андреас Шефер, « Загрузчики классов внутри », 12 ноября 2003 г.
  • Шенг Лян и Гилад Браха, « Динамическая загрузка классов в виртуальной машине Java », В материалах 13-й конференции ACM по объектно-ориентированному программированию, системам, языкам и приложениям (OOPSLA'98), Уведомления ACM SIGPLAN, т. 33, нет. . 10, ACM Press, 1998, стр 36-44 DOI : 10,1145 / 286936,286945
  • Джереми Уитлок, « Использование пользовательских загрузчиков классов в реальном мире », май 2005 г.
  • Д-р Кристоф Дж. Юнг, " Classloaders Revisited Hotdeploy ", Информационный бюллетень специалистов по Java , 07.06.2001
  • Дон Шварц, " Управление зависимостями компонентов с помощью загрузчиков классов ", 2005-04-13
Источник « https://en.wikipedia.org/w/index.php?title=Java_Classloader&oldid=1045988403 »