Загрузчик классов Java - Java Classloader
В Загрузчик классов Java является частью Среда выполнения Java это динамически загружает Классы Java в Виртуальная машина Java.[1] Обычно классы загружаются только на лету. Системе времени выполнения Java не нужно знать о файлах и файловых системах, поскольку это делегированный в загрузчик классов.
А библиотека программного обеспечения представляет собой собрание связанных объектный код.В Язык Java, библиотеки обычно упаковываются в Файлы JAR. Библиотеки могут содержать объекты разных типов. Самый важный тип объекта, содержащегося в файле Jar, - это Класс Java. Класс можно рассматривать как именованную единицу кода. Загрузчик классов отвечает за поиск библиотек, чтение их содержимого и загрузку классов, содержащихся в библиотеках. Эта загрузка обычно выполняется «по запросу», то есть не происходит до тех пор, пока класс не будет вызван программой. Класс с заданным именем может быть загружен данным загрузчиком классов только один раз.
Каждый класс Java должен быть загружен загрузчиком классов.[2] Более того, Ява программы могут использовать внешние библиотеки (то есть библиотеки, написанные и предоставленные кем-то, кроме автора программы), или они могут состоять, по крайней мере частично, из ряда библиотек.
При запуске JVM используются три загрузчика классов:[3][4]
- Загрузчик классов начальной загрузки
- Загрузчик классов расширений
- Загрузчик системных классов
Загрузчик классов начальной загрузки загружает основные библиотеки Java.[fn 1] расположен в
каталог. Этот загрузчик классов, который является частью ядра JVM, написан в машинном коде.
Загрузчик классов расширений загружает код в каталоги расширений (
,[3] или любой другой каталог, указанный java.ext.dirs
системное свойство). Реализуется sun.misc.Launcher $ ExtClassLoader
учебный класс.
Загрузчик системного класса загружает код, найденный на java.class.path
, который соответствует КЛАСС
переменная окружения. Это реализовано sun.misc.Launcher $ AppClassLoader
учебный класс.
Пользовательские загрузчики классов
Загрузчик классов Java написан на Java. Поэтому можно создать собственный загрузчик классов, не разбираясь в тонкостях виртуальной машины Java. Каждый загрузчик классов Java имеет загрузчик родительского класса, который определяется, когда создается новый загрузчик классов, или устанавливается в системный загрузчик классов виртуальной машины по умолчанию.
Это позволяет (например):
- для загрузки или выгрузки классов во время выполнения (например, для динамической загрузки библиотек во время выполнения, даже из HTTP ресурс). Это важная функция для:
- реализация языков сценариев, таких как Jython
- с помощью фасоль строители
- позволяя определяемые пользователем расширяемость
- позволяя несколько пространства имен общаться. Это одна из основ CORBA / RMI протоколы например.
- изменить способ байт-код загружен (например, можно использовать зашифрованный Байт-код класса Java[5]).
- для изменения загруженного байт-кода (например, для времени загрузки ткачество аспектов при использовании аспектно-ориентированное программирование ).
Загрузчики классов в 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.
Смотрите также
- Загрузчик (вычисления)
- Динамическая загрузка
- DLL ад
- OSGi
- Путь к классам (Java)
- Модульная система платформы Java
Сноски
Рекомендации
- ^ Макманис, Чак (1 октября 1996 г.). «Основы загрузчиков классов Java». JavaWorld. Получено 2020-07-13.
- ^ а б Кристудас, Бинильдас (26 января 2005 г.). «Внутреннее устройство загрузки классов Java». onjava.com. Архивировано из оригинал на 2018-05-10.
- ^ а б «Понимание загрузки класса расширения». Учебники по Java. docs.oracle.com. Получено 2020-07-13.
- ^ Сосноски, Деннис (29 апреля 2003 г.). «Классы и загрузка классов». IBM DeveloperWorks. Получено 2008-01-26.
- ^ Рубцов, Владимир (9 мая 2003 г.). «Взлом шифрования байтового кода Java». JavaWorld. Получено 2020-07-13.
- ^ деБоэр, Тим; Карасюк, Гэри (21 августа 2002 г.). «Демистификация загрузки класса J2EE». IBM DeveloperWorks. Получено 2008-01-26.
- ^ https://web.archive.org/web/20130601002059/http://incubator.apache.org/depot/version/jar-hell.html
- ^ http://articles.qos.ch/classloader.html
- ^ Марк Рейнхольд (20 сентября 2010 г.). "Проект Пазл". Корпорация Oracle. Архивировано из оригинал на 2015-12-08.
- ^ "Проект Пазл". Корпорация Oracle. Получено 2015-11-29.
внешняя ссылка
- Чак МакМанис "Основы загрузчиков классов Java ", 1996
- Брэндон Э. Тейлор "Загрузка классов Java: основы ", 2003
- Джефф Хэнсон "Возьмите под свой контроль загрузку классов в Java ", 2006-06-01
- Андреас Шефер, "Загрузчики классов ", 2003-11-12
- Шэн Лян и Гилад Браха "Динамическая загрузка классов в виртуальной машине Java ", В трудах 13-й конференции ACM по объектно-ориентированному программированию, системам, языкам и приложениям (OOPSLA'98), ACM SIGPLAN Notices, том 33, № 10, ACM Press, 1998, стр. 36–44 Дои:10.1145/286936.286945
- Джереми Уитлок "Реальное использование пользовательских загрузчиков классов ", Май 2005 г.
- Доктор Кристоф Дж. Юнг "Возвращение к загрузчикам классов Hotdeploy ", Информационный бюллетень Java Specialist, 2001-06-07
- Дон Шварц "Управление зависимостями компонентов с помощью загрузчиков классов ", 2005-04-13