Какова роль загрузчика классов в Java?



Эта статья представляет собой подробное руководство о том, как ClassLoader работает в Java. В нем обсуждаются типы, принципы и методы ClassLoader в Java.

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

В этой статье будут рассмотрены следующие темы:





  1. Что такое ClassLoader?
  2. Типы ClassLoader
  3. Принципы ClassLoader
  4. Методы ClassLoader
  5. Пользовательский загрузчик классов

Приступим!

Что такое ClassLoader в Java?

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



Теперь давайте разберемся с различными типами встроенных загрузчиков классов в Java.

Типы ClassLoader в Java

Различные типы загрузчиков классов в Java следующие:

Давайте обсудим каждую из них по очереди.



Расширение ClassLoader

Как следует из названия, Extension ClassLoader загружает расширения основных классов Java из JDK Библиотека расширений. Это дочерний элемент Bootstrap ClassLoader, который загружает расширения из каталога JRE / lib / text или любого другого каталога, указанного в системном свойстве java.ext.dirs.

Application или System ClassLoader

Приложение или System ClassLoader является дочерним по отношению к Extension ClassLoader. Этот тип ClassLoader загружает все классы уровня приложения, указанные в параметре командной строки -cp или в переменной среды CLASSPATH.

Загрузчик классов начальной загрузки

Как мы все знаем, Классы Java загружаются экземпляром java.lang.ClassLoade. Но поскольку ClassLoaders являются классами, загрузчик ClassLoader Bootstrap отвечает за загрузку внутренних классов JDK. BootStrap ClassLoader - это машинный код, который запускает операцию, когда ее вызывает JVM, и загружает классы из rt.jar. Итак, вы можете понять, что у Bootstrap ClassLoader нет родительского ClassLoader, поэтому он известен как Primordial ClassLoader.

Заметка: Приоритет Bootstrap выше, чем Extension, а приоритет, присвоенный Extension ClassLoader, выше, чем Application ClassLoader. См. Изображение ниже:

Типы ClassLoader - ClassLoader в Java - Edureka

Далее в этой статье давайте разберемся с принципами, на которых работает ClassLoader.

Принципы ClassLoader в Java

Набор правил, на основе которых работает Java ClassLoader, состоит из следующих трех принципов:

Давайте разберемся с каждым из них.

Свойство уникальности

Это свойство гарантирует, что классы не будут повторяться и все классы будут уникальными. Свойство уникальности также гарантирует, что классы, загружаемые родительским ClassLoader, не загружаются дочерним ClassLoader. В сценарии, когда родительский ClassLoader не может найти класс, текущий экземпляр попытается сделать это сам.

Модель делегирования

ClassLoader в Java работает на основе набора операций, заданных моделью делегирования. Итак, всякий раз, когда создается запрос на поиск класса или ресурса, экземпляр ClassLoader делегирует поиск класса или ресурса родительскому ClassLoader.

html-таблица в таблице

Набор операций, на основе которых работает ClassLoader, следующий:

  • Виртуальная машина Java проверяет, загружен ли класс или нет, всякий раз, когда он встречает класс.
  • В случае, когда класс загружен JVM продолжает выполнение класса, но в сценарии, когда класс не загружен, тогдаJVM просит подсистему Java ClassLoader загрузить этот конкретный класс. После этого подсистема ClassLoader передает управление Application ClassLoader.
  • Затем Application ClassLoader делегирует запрос Extension ClassLoader, который после этого передает запрос Bootstrap ClassLoader.
  • Теперь Bootstrap ClassLoader ищет вПуть к классам Bootstrap, чтобы проверить, доступен ли класс. Если класс доступен, он загружается, иначе запрос снова передается в Extension ClassLoader.
  • Extension ClassLoader проверяет класс в пути к классам расширения.Если класс доступен, то он загружается, иначе запрос снова передается в Application ClassLoader.
  • Наконец, Application ClassLoader ищет класс в пути к классам приложения.Если класс доступен, он загружается, иначе вы увидите исключение ClassNotFoundException.

См. Изображение ниже.

Принцип видимости

В соответствии с этим принципом дочерние классы видны классам, загруженным его родительскими загрузчиками ClassLoaders, но наоборот - неверно. Таким образом, классы, загруженные Application ClassLoader, имеют видимость в классах, загруженных Extension и Bootstrap ClassLoader.

Например, если у нас есть два класса: A и B, предположим, что класс A загружен приложением ClassLoader, а класс B загружен Extensions ClassLoader. Здесь классы A и B видны всем этим классам, загруженным Application ClassLoader, но класс B виден только тем классам, которые загружены Extension ClassLoader.

Кроме того, если вы попытаетесь загрузить эти классы с помощью Bootstrap ClassLoader, вы увидите java.lang.ClassNotFoundException . исключение.

Хорошо, теперь, когда вы знаете типы загрузчиков классов и принципы, лежащие в их основе, давайте рассмотрим несколько важных методов.от java.lang.ClassLoader класс.

Методы ClassLoader в Java

Немного необходимых ClassLoader следующие:

loadClass (имя строки, логическое разрешение)

Этот метод является точкой входа ClassLoader и используется для загрузки класса, на который ссылается JVM. Он берет имя в качестве параметра. JVM вызывает метод loadClass () для разрешения ссылок на классы, устанавливая логическое значение в true. Только если нам нужно определить, существует класс или нет, для логического параметра устанавливается значение false.

Браузер db для учебника sqlite

Декларация:

public Class loadClass (имя строки, логическое разрешение) выбрасывает ClassNotFoundException {

defineClass ()

Последний метод, используемый для определения массива байтов как экземпляра класса. Если класс недействителен, он выдает ошибку ClassFormatError.

Декларация:

защищенный окончательный класс defineClass (имя строки, byte [] b, int off, int len) выдает ошибку ClassFormatError

findClass (имя строки)

Метод findClass используется для поиска указанного класса. Таким образом, он просто находит класс с полным именем в качестве параметра, но не загружает класс. Метод loadClass () вызывает этот метод, если родительский ClassLoader не может найти запрошенный класс. Кроме того, если ни один родитель ClassLoader не находит класс, реализация по умолчанию генерирует ClassNotFoundException.

Декларация:

protected Class findClass (String name) выбрасывает ClassNotFoundException

Class.forName (имя строки, логическая инициализация, загрузчик ClassLoader)

Этот метод используется для загрузки и инициализации класса. Это дает возможность выбрать любой из загрузчиков классов и, если параметр ClassLoader равен NULL, тогда автоматически используется загрузчик классов Bootstrap..

Декларация:

общедоступный статический класс forName (имя строки, логическая инициализация, загрузчик ClassLoader) выдает исключение ClassNotFoundException

getParent ()

Метод getParent используется для возврата родительского ClassLoader для делегирования.

Декларация:

общедоступный финальный ClassLoader getParent ()

getResource ()

Как следует из названия, метод getResource () пытался найти ресурс с заданным именем. Первоначально он делегирует запрос родительскому ClassLoader для ресурса. Если родительский элемент равен нулю, выполняется поиск по пути к ClassLoader, встроенному в JVM. Теперь, если это не удается, метод вызовет findResource (String) для поиска ресурса, где имя ресурса указано в качестве входных данных, которые могут быть либо абсолютным, либо относительным путем к классам. Затем он возвращает объект URL для чтения ресурса или возвращает нулевое значение, если ресурс не имеет соответствующих привилегий для возврата ресурса или не найден.

Декларация:

общедоступный URL getResource (имя строки)

Далее, в этой статье о ClassLoader в Java, давайте разберемся с Custom ClassLoader.

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

Встроенные загрузчики классов позаботятся о большинстве случаев, когда файлы уже находятся в файловой системе, но если вы хотите загрузить классы с локального жесткого диска, вам необходимо использовать пользовательские загрузчики классов.

Создать собственный загрузчик классов

Чтобы создать собственный ClassLoader, вам необходимо расширить ClassLoader класс и переопределить findClass () метод:

Пример: давайте создадим собственный ClassLoader, который расширяет ClassLoader по умолчанию и загружает байтовый массив из указанного файла. См. Код ниже.

package edureka import java.io.ByteArrayOutputStream import java.io.File import java.io.IOException import java.io.InputStream public class Sample extends ClassLoader {@Override public Class findClass (String samplename) выдает исключение ClassNotFoundException {byte [] b = customLoadClassFromFromFromFrom (samplename) return defineClass (samplename, b, 0, b.length)} закрытый байт [] customLoadClassFromFile (String demofilename) {InputStream inStream = getClass (). getClassLoader (). getResourceAsStream (demofilename.replace ('.', File. separatorChar) + '.class') byte [] буфер ByteArrayOutputStream bStream = new ByteArrayOutputStream () int nextValue = 0 try {while ((nextValue = inStream.read ())! = -1) {bStream.write (nextValue)}} catch (IOException e) {e.printStackTrace ()} buffer = bStream.toByteArray () return buffer}}

На этом мы подошли к концу статьи о ClassLoader в Java. Надеюсь, вы поняли, что такое ClassLoaders в Java, его методы, различные типы ClassLoaders и т. Д.

Если вы нашли эту статью «Загрузчик классов в Java», ознакомьтесь с от Edureka, надежной компании по онлайн-обучению с сетью из более чем 250 000 довольных учащихся по всему миру. Мы здесь, чтобы помочь вам на каждом этапе вашего пути, чтобы стать помимо этого java-интервью, мы разработали учебную программу, которая предназначена для студентов и профессионалов, которые хотят быть Ява Разработчик.

Есть вопрос к нам? Пожалуйста, укажите это в комментариях к этому «Загрузчику классов в Java. ' и мы свяжемся с вами как можно скорее.