Изучение архитектуры загрузки Java
Введение в загрузку классов
Загрузка классов считается фундаментальной концепцией, когда дело касается Java, она играет жизненно важную роль в работе наших Java-приложений. Когда Java-приложение начинает свое выполнение, оно не загружает все классы в память одновременно, а загружает только те, которые необходимы в данный момент. Это также известно как загрузка классов по требованию или загрузка классов.
Что это вообще значит ?
Спустимся немного!
Думайте о среде Java как об этой волшебной стране, где вы можете делать все что угодно! В волшебной стране вам, вероятно, понадобится волшебная книга с массой заклинаний и инструкций, я прав?
А теперь представьте, что мы получили эту волшебную книгу со всеми заклинаниями и инструкциями по их использованию. Но есть одна загвоздка: книга слишком большая, чтобы ее постоянно носить с собой.
Итак, вместо того, чтобы носить с собой всю книгу, вы решаете получить только пару страниц, которые вам нужны, когда они вам понадобятся. Таким образом, вы не устанете.
Загрузка классов немного похожа на ту волшебную книгу, которую мы видели ранее: в среде Java наши Java-программы подобны заклинаниям, и эти программы или приложения состоят из разных частей, называемых классами. Как и на страницах нашей книги, мы не хотим загружать все классы одновременно, потому что это замедлит работу компьютера и займет больше памяти, чем необходимо.
Это похоже на то, как будто вы открываете волшебную книгу, когда запускаете компьютерное приложение. Однако вместо того, чтобы загружать все классы в начале, компьютер выборочно загружает те, которые ему нужны, сразу же. Когда вы хотите использовать класс, например определенный инструмент для вашей программы, компьютер загружает только этот раздел программы и подготавливает его к использованию.
Давайте немного больше технической информации
Загрузка классов — это фундаментальный компонент среды выполнения Java, который отвечает за динамическую загрузку классов в память, когда они требуются для выполнения программы Java. Этот метод динамической загрузки имеет различные преимущества, включая улучшенное использование памяти и возможность создавать модульные расширяемые приложения.
В основе загрузки классов лежит идея динамической загрузки, при которой классы загружаются в память только тогда, когда на них ссылаются в потоке выполнения программы. В отличие от статически типизированных языков, Java откладывает загрузку классов до времени выполнения, обеспечивая большую гибкость.
Что такое иерархия загрузчика классов?
В Java иерархия загрузчика классов является фундаментальным компонентом среды выполнения, отвечающим за загрузку классов в память и поддерживающим выполнение программ Java. Понимание этой иерархии имеет решающее значение для эффективного управления загрузкой классов и обеспечения целостности ресурсов классов.
Давайте поместим это в эскиз!
Представьте, что у вас есть большая коробка разноцветных мелков. Эти мелки очень важны, потому что они помогают рисовать потрясающие картины. Теперь у вас есть особый друг по имени «Мелки Мастер».
У мастера по рисованию есть волшебная книга, в которой показано, как использовать каждый цветной карандаш для создания лучших рисунков. Эта книга особенная, потому что в ней рассказывается только о самых простых и важных мелках, которыми каждый любит пользоваться.
Когда вы хотите начать рисовать, вы звоните Мастеру карандашей. Они приходят со своей волшебной книгой и покажут вам, как использовать основные мелки, чтобы сделать ваши рисунки красочными и чудесными.
В среде Java у нас есть Bootstrap Classloader, который похож на Crayon Master. Он содержит наиболее важные инструменты (классы), которые все используют на игровой площадке Java. Эти инструменты помогают нам делать удивительные вещи точно так же, как специальные мелки помогают нам создавать красивые эскизы.
Загрузчик классов Bootstrap
Загрузчик классов Bootstrap — это фундаментальный компонент виртуальной машины Java (JVM), который отвечает за загрузку основных классов платформы Java. Эти основные классы необходимы для правильного функционирования самой JVM и являются основой, на которой строятся все приложения Java.
Загрузчик классов Bootstrap — это первый загрузчик классов, который запускается при запуске JVM. Его основная роль — загрузка классов из пути к классам начальной загрузки, который обычно включает в себя основные библиотеки Java, расположенные в каталоге «jre/lib» установки Java. Эти классы предоставляют основные строительные блоки, которые составляют основу языка программирования Java.
- Реализация. Он реализован в собственном коде (обычно написанном на таких языках, как C или C++), что отличает его от обычных загрузчиков классов Java, которые сами являются классами Java.
- Более высокий приоритет. Классы, загружаемые загрузчиком классов Bootstrap, имеют наивысший приоритет в иерархии загрузки классов. Это означает, что когда несколько загрузчиков классов пытаются загрузить один и тот же класс, версия, загруженная загрузчиком классов Bootstrap, имеет приоритет.
- Сначала загружается. Загрузчик классов Bootstrap загружается раньше любого другого загрузчика классов. Инициализируя JVM, он гарантирует, что основные классы Java доступны для выполнения JVM.
Загрузчик классов Bootstrap имеет предопределенный путь к классам, который указывает на основные библиотеки Java. Он не поддерживает модификацию или расширение стандартными средствами. В отличие от других загрузчиков классов, которые разработчики могут расширять или настраивать, поведение загрузчика классов Bootstrap контролируется самой JVM.
Хотя загрузчик классов Bootstrap находится на вершине иерархии загрузки классов, он не участвует в модели делегирования, за которой следуют другие загрузчики классов. У него нет родительского загрузчика классов, которому можно было бы делегировать запросы. Вместо этого он напрямую загружает основные классы из пути к классам начальной загрузки.
Что будет дальше?
Загрузчик классов Bootstrap не может делать все в одиночку, ему нужна пара друзей.
Давайте сначала нарисуем его!
В нашей Коробке с карандашами было несколько классных, но простых цветов. Было бы неплохо иметь специальные мелки, не правда ли? Некоторые из них добавят крутых эффектов, блестящих и сияющих!
Назовем этого следующего друга Исследователем мелков. У него есть большая секретная комната, полная фантастических мелков с уникальными эффектами и способностями.
Эти мелки настолько замечательные, что их можно хранить отдельно от обычной коробки с мелками. Если вы хотите придать своему произведению особый штрих, спросите об этом своего друга Crayon Explorer. Они идут в свою секретную комнату, выбирают идеальный специальный карандаш и отдают его вам. Эти специальные мелки позволяют создавать удивительные эффекты, которые обычные мелки сделать не могут.
В среде Java мы называем этого друга Crayon Explorer Extension Classloader. Это помогает найти и использовать дополнительные специальные инструменты (классы), которые придают вашим компьютерным программам особые возможности. Эти инструменты могут не входить в обычную коллекцию, но загрузчик классов Extension знает, где их найти, и делает их доступными для ваших творческих проектов на компьютере!
Загрузчик классов расширений
Загрузчик классов расширений — это важнейший компонент в иерархии загрузки классов Java, который управляет загрузкой классов из механизма расширения Java. Этот механизм позволяет добавлять дополнительные библиотеки и модули к платформе Java, расширяя ее возможности за пределы основных библиотек Java.
Загрузчик классов расширений отвечает за загрузку классов из каталогов расширений, которые представляют собой каталоги, содержащие дополнительные библиотеки и расширения, которые можно добавить на платформу Java. Эти расширения предоставляют дополнительные функциональные возможности и возможности, расширяющие возможности среды выполнения Java.
Каталоги расширений обычно расположены в каталоге «jre/lib/ext» установки Java. Они содержат файлы JAR или другие файлы классов, принадлежащие расширениям. Эти расширения должны быть глобально доступны для всех приложений Java, работающих в одной и той же установке Java.
Загрузчик классов расширения следует модели делегирования «родитель-потомок», где он делегирует загрузку классов загрузчику классов Bootstrap. Если загрузчик классов Bootstrap не может найти класс, загрузчик классов расширения пытается его загрузить. Эта модель гарантирует, что расширения не мешают основным классам Java, и поддерживает четкую иерархию загрузки классов.
В отличие от некоторых других загрузчиков классов, загрузчик классов Extension не предназначен для настройки или расширения разработчиками. Его поведение обычно контролируется средой выполнения Java. Это ограничение введено для обеспечения стабильности, безопасности и целостности платформы Java.
Загрузчик классов расширения расположен над загрузчиком классов приложения (системы) в иерархии загрузки классов. Он играет роль в создании отдельного уровня для расширений, отделяя их от классов, специфичных для приложения. Такое разделение гарантирует глобальную доступность расширений, способствуя модульности и повторному использованию кода.
Что такое загрузчик классов приложения (системы)?
Нам нужен еще один друг, который поможет нам немного.
Давайте нарисуем это!
Сначала у нас было несколько простых мелков, которые сыграли решающую роль в основе нашего наброска, затем у нас появились специальные мелки, которые добавляют очень крутые эффекты, но что теперь будет вишенкой на торте? Несколько нестандартных мелков!!!
Давайте представим, что у нас также есть несколько нестандартных мелков, которые мы сами создали, используя сочетание цветов, которые нам нравятся. Эти специальные мелки позволяют создавать на бумаге самые удивительные цвета и эффекты.
У вас есть друг по имени «Карандаш Рисунок», волшебник, владеющий магией рисования. Они точно знают, как заставить специальные мелки работать над вашими эскизами.
В завершение нашей работы мы обращаемся за помощью к нашему рисовщику мелками. Crayon Sketcher попадает в нашу коробку с индивидуальными мелками, и наш друг помогает нам, как использовать наши специальные мелки, чтобы улучшить наш эскиз. Он знает правильные инструкции по использованию мелков и помогает нам создать наш шедевр.
Так же, как ваш друг Crayon Кодер помогает нам использовать наши специальные мелки на холсте, Приложение Загрузчик классов, действуя как волшебный друг, переносит созданные вами классы в вашу компьютерную программу, заставляя ее работать именно так, как вы задумали!
Загрузчик классов приложений
Загрузчик классов приложений, также известный как системный загрузчик классов, является фундаментальным компонентом механизма загрузки классов Java, ответственным за загрузку классов, которые являются частью исполняемого приложения.
Основная роль загрузчика классов приложения — загрузка классов из пути к классам приложения. Путь к классам — это список каталогов и файлов JAR (архив Java), в которых виртуальная машина Java (JVM) ищет классы при запуске программы. Эти классы включают как стандартные классы библиотеки Java, так и классы, специфичные для приложения.
При запуске программы Java загрузчик классов приложения считывает настройки пути к классам, чтобы определить, где найти необходимые классы. Он сканирует каталоги путей к классам и файлы JAR, чтобы найти необходимые файлы классов. Если класс необходим во время выполнения, загрузчик классов приложения пытается загрузить его из указанных мест.
Загрузчик классов приложения следует отношениям «родитель-потомок» в иерархии загрузки классов. Его родителем является загрузчик классов расширений, который загружает классы из каталогов расширений. Если загрузчик классов приложения не может найти требуемый класс, он делегирует поиск его родителю, а если родитель тоже не может его найти, обращается к загрузчику классов Bootstrap (который загружает основные классы Java).
Разработчики могут влиять на поведение загрузчика классов приложения, настраивая путь к классам. Указывая каталоги и файлы JAR при запуске приложения Java, разработчики могут контролировать, где загрузчик классов ищет классы. Это обеспечивает гибкость в обработке зависимостей и поддержке различных конфигураций.
Одной из сильных сторон загрузчика классов приложений является поддержка динамической загрузки классов. Это означает, что классы можно загружать в JVM даже после запуска программы. Динамическая загрузка полезна, когда вы хотите добавить в приложение новые функции, не останавливая его.
Загрузчик классов приложений гарантирует, что классы из разных приложений или компонентов не мешают друг другу. Каждое Java-приложение, работающее на одной JVM, имеет собственный загрузчик классов приложений, обеспечивающий изоляцию и предотвращающий конфликты между классами разных приложений.
Спасибо, что дочитали до конца. Пожалуйста, подумайте о том, чтобы подписаться на автора и эту публикацию. Посетите Stackademic, чтобы узнать больше о том, как мы демократизируем бесплатное образование в области программирования во всем мире.