Что такое Java ClassLoader?

В нескольких простых предложениях, что такое Java ClassLoader, когда он используется и почему?

ОК, я прочитал статью в вики. ClassLoader загружает классы. ОК. Поэтому, если я включаю файлы jar и импортирую, ClassLoader выполняет эту работу.

Почему я должен беспокоиться об этом ClassLoader? Я никогда не использовал его и не знал, что он существует.

Вопрос в том, почему класс ClassLoader существует? А также, как вы используете его на практике? (Случаи существуют, я знаю.)

Ответ 1

Взято из этого приятного учебника от Sun:

Мотивация

Приложения, написанные на статически скомпилированных языках программирования, такие как C и С++, скомпилированы в собственные инструкции, определенные машиной, и сохраняются как исполняемый файл. Процесс объединения кода в исполняемый собственный код называется linking - слияние отдельно скомпилированного кода с кодом общей библиотеки для создания исполняемого приложения. Это отличается от динамически скомпилированных языков программирования, таких как Java. В Java файлы .class, сгенерированные компилятором Java, остаются как есть до загрузки в виртуальную машину Java (JVM) - другими словами, процесс связывания выполняется JVM во время выполнения. Классы загружаются в JVM по принципу "по мере необходимости". И когда загруженный класс зависит от другого класса, этот класс также загружается.

При запуске приложения Java первый класс, который запускается (или точка входа в приложение), является тем, у кого есть открытый метод static void, называемый main(). Этот класс обычно имеет ссылки на другие классы, и все попытки загрузить ссылочные классы выполняются загрузчиком классов.

Чтобы получить ощущение этой рекурсивной загрузки классов, а также идею загрузки класса в целом, рассмотрим следующий простой класс:

public class HelloApp {
   public static void main(String argv[]) {
      System.out.println("Aloha! Hello and Bye");
   }
}

Если вы запустите этот класс, указав параметр командной строки -verbose: class, чтобы он печатал, какие классы загружаются, вы получите результат, который выглядит следующим образом. Обратите внимание, что это всего лишь частичный вывод, так как список слишком длинный, чтобы показать здесь.

prmpt>java -verbose:class HelloApp



[Opened C:\Program Files\Java\jre1.5.0\lib\rt.jar]
[Opened C:\Program Files\Java\jre1.5.0\lib\jsse.jar]
[Opened C:\Program Files\Java\jre1.5.0\lib\jce.jar]
[Opened C:\Program Files\Java\jre1.5.0\lib\charsets.jar]
[Loaded java.lang.Object from shared objects file]
[Loaded java.io.Serializable from shared objects file]
[Loaded java.lang.Comparable from shared objects file]
[Loaded java.lang.CharSequence from shared objects file]
[Loaded java.lang.String from shared objects file]
[Loaded java.lang.reflect.GenericDeclaration from shared objects file]
[Loaded java.lang.reflect.Type from shared objects file]
[Loaded java.lang.reflect.AnnotatedElement from shared objects file]
[Loaded java.lang.Class from shared objects file]
[Loaded java.lang.Cloneable from shared objects file]
[Loaded java.lang.ClassLoader from shared objects file]
[Loaded java.lang.System from shared objects file]
[Loaded java.lang.Throwable from shared objects file]
.
.
.
[Loaded java.security.BasicPermissionCollection from shared objects file]
[Loaded java.security.Principal from shared objects file]
[Loaded java.security.cert.Certificate from shared objects file]
[Loaded HelloApp from file:/C:/classes/]
Aloha! Hello and Bye
[Loaded java.lang.Shutdown from shared objects file]
[Loaded java.lang.Shutdown$Lock from shared objects file]

Как вы можете видеть, сначала загружаются классы времени выполнения Java, требуемые классом приложения (HelloApp).

Погрузчики классов на платформе Java 2

Язык программирования Java продолжает развиваться, чтобы сделать жизнь разработчиков приложений проще каждый день. Это делается путем предоставления API-интерфейсов, которые упрощают вашу жизнь, позволяя вам сосредоточиться на бизнес-логике, а не на деталях реализации основных механизмов. Это видно из недавнего изменения J2SE 1.5 до J2SE 5.0, чтобы отразить зрелость платформы Java.

Как и в JDK 1.2, загрузчик классов bootstrap, встроенный в JVM, отвечает за загрузку классов среды выполнения Java. Этот загрузчик классов загружает только классы, которые находятся в пути к загрузке, и поскольку это доверенные классы, процесс проверки не выполняется как для ненадежных классов. В дополнение к загрузчику класса bootstrap JVM имеет загрузчик классов расширения, отвечающий за загрузку классов из стандартных API расширений, и загрузчик системного класса, который загружает классы из общего пути класса, а также для ваших классов приложений.

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

Класс java.lang.ClassLoader

java.lang.ClassLoader - это абстрактный класс, который может быть подклассифицирован приложениями, которые должны расширять способ, с помощью которого JVM динамически загружает классы. Конструкторы в java.lang.ClassLoader (и его подклассы) позволяют указать родителя при создании экземпляра нового загрузчика классов. Если вы явно не укажете родителя, загрузчик системного класса виртуальной машины будет назначен как родитель по умолчанию. Другими словами, класс ClassLoader использует модель делегирования для поиска классов и ресурсов. Поэтому каждый экземпляр класса ClassLoader имеет связанный родительский загрузчик классов, поэтому при запросе поиска класса или ресурсов задача делегируется загрузчику родительского класса, прежде чем пытаться найти сам класс или ресурс. Метод loadClass() класса ClassLoader выполняет следующие задачи, чтобы при вызове загрузить класс:

Если класс уже загружен, он возвращает его. В противном случае он делегирует поиск нового класса загрузчику родительского класса. Если загрузчик родительского класса не находит класс, loadClass() вызывает метод findClass() для поиска и загрузки класса. Метод finalClass() ищет класс в текущем загрузчике классов, если класс не был найден загрузчиком родительского класса.


В оригинальной статье больше, в которой также показано, как реализовать свои собственные загрузчики сетевого класса, что отвечает на ваш вопрос о том, почему (и как). См. Также API-документы.

Ответ 2

В большинстве разработчиков Java никогда не потребуется явно использовать загрузчики классов (за исключением загрузки ресурсов, чтобы они все еще работали, когда они были связаны в JAR), не говоря уже о создании собственных.

ClassLoaders используются в больших системах и серверных приложениях для выполнения таких задач, как:

  • Модулировать систему и загружать, выгружать и обновлять модули во время выполнения
  • Параллельно используйте разные версии библиотеки API (например, XML-парсер)
  • Изолировать различные приложения, запущенные в пределах одной JVM (гарантируя, что они не мешают друг другу, например, через статические переменные)

Ответ 3

Вопрос: "Почему нужно беспокоиться этот класс ClassLoader существует??

Ну, в основном, вы можете исправить вещи, если они ошибаются: -).

Это правда, если вы просто пишете приложение, скомпилируете его в JAR и, возможно, включите несколько дополнительных JAR-библиотек библиотеки, вам не нужно знать о загрузчиках классов, он просто будет работать.

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

также.. как вы используете его на практике?

Для простых случаев они вам не нужны. Однако, если вам нужно динамически загружать код во время выполнения с явным контролем, в котором он происходит (например, загрузка по сети, загрузка плагинов, недоступных во время компиляции и т.д.), Вам может потребоваться сделать больше. Тогда вы можете, например, напишите свой собственный загрузчик классов. См. Другие ответы для ссылок.

Ответ 4

ClassLoader в Java - это класс, который используется для загрузки файлов классов в Java. Код Java компилируется в файл класса компилятором javac а JVM выполняет программу Java, выполняя байтовые коды, записанные в файле класса.

ClassLoader отвечает за загрузку файлов классов из файловой системы, сети или любого другого источника. Существует три загрузчика классов по умолчанию, используемых в загрузчике классов Java, Bootstrap, Extension и System или Application.

ClassLoader


How ClassLoader works

## Взаимодействие ClassLoader с JVM enter image description here

Больше @: how-classloader-works-in-java.html

Ответ 5

Class Loaders являются функциональным компонентом JVM, который загружает данные класса из файла ".class" или из сети в область "Метод" в "Куче".

Похож на неотъемлемую часть JVM, но как конечного пользователя java, почему я должен быть обеспокоен? Вот почему:

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

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

Родительский механизм делегирования родительских роликов классов гарантирует, что классы java api никогда не могут быть взломаны с помощью несанкционированного кода.

Подробнее смотрите здесь

Ответ 6

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

Как загрузился самый первый класс?
Первый класс загружается с помощью метода static main(), объявленного в вашем классе. Все загружаемые классы загружаются классами, которые уже загружены и запущены.

загрузчик классов создает пространство имен. Все JVM включают в себя по крайней мере один загрузчик классов, встроенный в JVM, называемый загрузчиком класса primordial (или bootstrap). Это одно, и мы будем смотреть на первобытные загрузчики классов. JVM имеет в нем крючки, чтобы использовать пользовательские загрузчики классов вместо первоначального загрузчика классов. Вот классные загрузчики, созданные JVM.

Бутстрап (изначальный) Этот загрузчик классов не загружается. Загружает внутренние классы JDK, пакеты java. * (Обычно загружает rt.jar и i18n.jar). Extesions Этот загрузчик классов не загружается. Загружает файлы jar из каталога расширений JDK (обычно lib/ext JRE). система Этот загрузчик классов не загружается. Загружает классы из пути к системному классу.

http://www.sbalasani.com/2015/01/java-class-loaders.html

Ответ 7

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

Давай уточним.

В JVM каждый класс загружается некоторым экземпляром java.lang.ClassLoader. Всякий раз, когда новая JVM запускается вашей обычной Java-программой, запускающей команду java <classname>, первым шагом является загрузка всех ключевых классов в памяти, необходимых для правильной работы, таких как java.lang.Object и другие классы времени выполнения (rt.jar).

Теперь в ClassLoader есть 3 части:

  • BootstrapClassLoader отвечает за обеспечение доступности этих классов, т.е. за загрузку этих классов в память.

  • Следующая задача - загрузить любые внешние библиотеки /JAR файлы в память для правильной работы приложения. ExtClassLoader отвечает за эту задачу. Этот загрузчик классов отвечает за загрузку всех файлов .jar, указанных в пути java.ext.dirs.

  • Третий и самый важный загрузчик классов - AppClassLoader. Загрузчик классов приложения отвечает за загрузку файлов классов, указанных в системном свойстве java.class.path.

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

enter image description here

Проверьте это, чтобы узнать больше о Java Class Loader.