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

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

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

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

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

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

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

Загрузчик классов расширений загружает код в каталоги расширений ( / jre / lib / ext,[3] или любой другой каталог, указанный java.ext.dirs системное свойство). Реализуется sun.misc.Launcher $ ExtClassLoader учебный класс.

Загрузчик системного класса загружает код, найденный на java.class.path, который соответствует КЛАСС переменная окружения. Это реализовано sun.misc.Launcher $ AppClassLoader учебный класс.

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

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

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

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

Джакарта EE (ранее Java EE и J2EE) серверы приложений обычно загружают классы из развернутого ВОЙНА или EAR архивировать с помощью дерева загрузчиков классов, изолируя приложение от других приложений, но разделяя классы между развернутыми модулями. Так называемый "контейнеры сервлетов "обычно реализуются в виде нескольких загрузчиков классов.[2][6]

JAR ад

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

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

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

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

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

Сноски

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

Рекомендации

  1. ^ Макманис, Чак (1 октября 1996 г.). «Основы загрузчиков классов Java». JavaWorld. Получено 2020-07-13.
  2. ^ а б Кристудас, Бинильдас (26 января 2005 г.). «Внутреннее устройство загрузки классов Java». onjava.com. Архивировано из оригинал на 2018-05-10.
  3. ^ а б «Понимание загрузки класса расширения». Учебники по Java. docs.oracle.com. Получено 2020-07-13.
  4. ^ Сосноски, Деннис (29 апреля 2003 г.). «Классы и загрузка классов». IBM DeveloperWorks. Получено 2008-01-26.
  5. ^ Рубцов, Владимир (9 мая 2003 г.). «Взлом шифрования байтового кода Java». JavaWorld. Получено 2020-07-13.
  6. ^ деБоэр, Тим; Карасюк, Гэри (21 августа 2002 г.). «Демистификация загрузки класса J2EE». IBM DeveloperWorks. Получено 2008-01-26.
  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. Получено 2015-11-29.

внешняя ссылка