Что такое ClassLoder Java?

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

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

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

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

169
задан Premraj 29 April 2017 в 12:18
поделиться

3 ответа

Взято из этого замечательного учебника от Sun:

Мотивация

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

Когда запускается приложение Java, первым запускается класс (или точка входа в приложение) с открытым статическим методом 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, загрузчик классов начальной загрузки, встроенный в JVM, отвечает за загрузку классов среды выполнения Java. Этот загрузчик классов загружает только те классы, которые находятся в пути к классам загрузки, и, поскольку это доверенные классы, процесс проверки не выполняется, как для ненадежных классов. В дополнение к загрузчику классов начальной загрузки JVM имеет загрузчик классов расширения, отвечающий за загрузку классов из стандартных API расширений, и загрузчик системных классов, который загружает классы из общего пути к классам, а также классы вашего приложения.

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

Класс java.lang.ClassLoader

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

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


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

223
ответ дан 23 November 2019 в 20:51
поделиться

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

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

  • Модульная система и загрузка, выгрузка и обновление модулей во время выполнения.
  • Использование разных версий библиотеки API (например, синтаксического анализатора XML) параллельно
  • Изолируйте разные приложения, работающие в одной JVM (убедитесь, что они не мешают друг другу, например, с помощью статических переменных)
45
ответ дан 23 November 2019 в 20:51
поделиться

Возникает вопрос: «Зачем нужно беспокоиться о том, что этот класс ClassLoader существует»?

Ну, в основном для того, чтобы вы могли исправить что-то, если что-то пойдет не так :-).

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

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

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

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

27
ответ дан 23 November 2019 в 20:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: