Найти тему
81 подписчик

🖥 Глубокое погружение в Java: рефлексия и загрузчик классов. Часть 2.


Загрузчики классов
В объектно-ориентированном программировании единицей программного обеспечения является класс. Он представляет собой логическую сущность или блок. То, как классы загружаются в JVM, обычно не представляет особого интереса.

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

Однако изучение внутренних механизмов загрузки классов в Java полезно, поскольку внутренняя система загрузки классов в JVM фактически доступна для программистов, которые могут вмешиваться в процесс загрузки классов и изменять поведение JVM в случае необходимости.

Это имеет целый ряд преимуществ и практических применений. Одним из них является контроль над тем, какие именно файлы классов загружаются в JVM, что позволяет предотвратить проблемы и конфликты, связанные с загрузкой зависимостей.

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

JVM
В Java используется гибридный подход к выполнению программного кода, сочетающий компиляцию и интерпретацию. Сначала класс Java определяется программистом в формате файла .java. Затем компилятор Java преобразует его в байт-код, генерируя файл .class.

Байт-код — это промежуточный язык, который понимает JVM.

Java-программы выполняются с помощью виртуальной машины Java (JVM). Идея виртуальной машины Java заключается в том, что она действует как абстрактный виртуальный компьютер, который создает изолированную среду для выполнения Java-программ. Работающая JVM практически не знает о своем хост-компьютере и определяет строгий протокол загрузки программных файлов из файловой системы компьютера для выполнения.

JVM включает в себя три отдельные области:

▪️подсистему загрузчика классов (ClassLoader Subsystem);
▪️область памяти/данных времени выполнения (Runtime Memory/Data Area);
▪️механизм выполнения (Execution Engine).

Подсистема загрузчика классов  — это единственный компонент JVM, который работает с файловой системой хост-устройства. Он отвечает за поиск файлов классов и их загрузку в JVM. При запросе на загрузку класса система загрузчика классов считывает байт-код его файла класса в JVM, затем конструирует эквивалентный объект Class и сохраняет байт-код его метода в куче (напомним, что классы существуют внутри JVM как объекты Class). Эти шаги показаны на следующей схеме:


2 минуты