Core - 1

Что такое загрузчик классов (classloader)?


Загрузчик классов (classloader) - это компонент виртуальной машины Java (JVM), который отвечает за загрузку классов во время выполнения программы. Загрузчик классов выполняет следующие задачи: 1. Поиск классов: Загрузчик классов ищет и загружает классы во время выполнения программы. Он просматривает различные источники, такие как файловая система, JAR-файлы, сетевые ресурсы и другие, чтобы найти и загрузить требуемый класс. 2. Загрузка классов: Загрузчик классов отвечает за фактическую загрузку классов в память JVM. Он считывает байт-код класса из источника и создает соответствующую структуру данных в памяти JVM. 3. Разрешение зависимостей: Загрузчик классов разрешает зависимости между классами. Если класс, который требуется загрузить, зависит от других классов, загрузчик классов также загружает и эти зависимые классы. 4. Изоляция классов: Загрузчик классов обеспечивает изоляцию классов, что означает, что классы, загруженные разными загрузчиками, не могут взаимодействовать напрямую друг с другом. Это помогает обеспечить безопасность и изоляцию между различными компонентами программы. Процесс загрузки класса состоит из трех частей: • Loading – на этой фазе происходит поиск и физическая загрузка файла класса в определенном источнике (в зависимости от загрузчика). Этот процесс определяет базовое представление класса в памяти. На этом этапе такие понятия как «методы», «поля» и т. д. пока неизвестны. • Linking – процесс, который может быть разбит на 3 части: ◦ Bytecode verification – проверка байт-кода на соответствие требованиям, определенным в спецификации JVM; ◦ Class preparation – создание и инициализация необходимых структур, используемых для представления полей, методов, реализованных интерфейсов и т.п., определенных в загружаемом классе; ◦ Resolving – загрузка набора классов, на которые ссылается загружаемый класс. • Initialization – вызов статических блоков инициализации и присваивание полям класса значений по умолчанию. Динамическая загрузка классов в Java имеет ряд особенностей: • отложенная (lazy) загрузка и связывание классов. Загрузка классов производится только при необходимости, что позволяет экономить ресурсы и распределять нагрузку. • проверка корректности загружаемого кода (type safeness). Все действия, связанные с контролем использования типов, производятся только во время загрузки класса, позволяя избежать дополнительной нагрузки во время выполнения кода. • программируемая загрузка. Пользовательский загрузчик полностью контролирует процесс получения запрошенного класса – самому ли искать байт-код и создавать класс или делегировать создание другому загрузчику. Дополнительно существует возможность выставлять различные атрибуты безопасности для загружаемых классов, позволяя таким образом работать с кодом из ненадежных источников. • множественные пространства имен. Каждый загрузчик имеет свое пространство имен для создаваемых классов. Соответственно, классы, загруженные двумя различными загрузчиками на основе общего байт-кода, в системе будут различаться. Существует несколько способов инициировать загрузку требуемого класса: • явный: вызов ClassLoader.loadClass() или Class.forName() (по умолчанию используется загрузчик, создавший текущий класс, но есть возможность и явного указания загрузчика); • неявный: когда для дальнейшей работы приложения требуется ранее не использованный класс, JVM инициирует его загрузку. JVM может использовать несколько загрузчиков классов, работающих вместе для загрузки и управления классами. Каждый загрузчик классов имеет свою область ответственности и иерархию загрузки. Загрузчики классов могут быть настроены и настраиваемы в зависимости от требований приложения.


Копировать ссылку