Что такое Java ClassLoader?
в нескольких простых предложениях, что такое Java ClassLoader, когда он используется и почему?
хорошо, я прочитал статью Вики. Загрузчик классов загружает классы. ЛАДНО. Поэтому, если я включаю файлы jar и импортирую, загрузчик классов выполняет эту работу.
Почему я должен беспокоиться об этом загрузчике классов? Я никогда не использовал его и не знал, что он существует.
вопрос в том, почему существует класс ClassLoader? А также, как вы используете его на практике? (Случаи существуют, я знаю.)
6 ответов:
взято из этого Ницца учебник Солнце:
мотивация
приложения, написанные на статически скомпилированных языках программирования, таких как C и c++, компилируются в собственные машинные инструкции и сохраняются в виде исполняемого файла. Процесс объединения кода в исполняемый нативный код называется linking-слияние отдельно скомпилированного кода с общим кодом библиотеки для создания исполняемого приложения. Это отличается в динамически компилируемые языки программирования, такие как Java. На Яве, то .файлы классов, созданные компилятором 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 расширения, и загрузчик системных классов, который загружает классы из общего пути к классу, а также классы приложений.
поскольку существует несколько загрузчиков классов, они представлены в дереве, корнем которого является загрузчик класса bootstrap. Каждый загрузчик классов имеет ссылку на своего родителя загрузчик классов. Когда загрузчик классов запрашивается для загрузки класса, он консультируется со своим родительским загрузчиком классов перед попыткой загрузить сам элемент. Родитель, в свою очередь, консультируется со своим родителем и так далее. Таким образом, только после того, как все загрузчики классов-предков не могут найти класс, в котором участвует текущий загрузчик классов. Другими словами, используется модель делегирования.
java.ленг.ClassLoader Class
The
java.lang.ClassLoader- это абстрактный класс, который может быть разделен на подклассы приложений, необходимо расширить способ, которым JVM динамически загружает классы. Конструкторы вjava.lang.ClassLoader(и его подклассы) позволяют указать родителя при создании экземпляра нового загрузчика классов. Если явно не указать родителя, загрузчик системных классов виртуальной машины будет назначен в качестве родителя по умолчанию. Другими словами, класс ClassLoader использует модель делегирования для поиска классов и ресурсов. Таким образом, каждый экземпляр загрузчика классов имеет соответствующий загрузчик родительского класса, так что при запросе поиска класса или ресурсов задача делегируется загрузчику родительского класса перед попыткой найти сам класс или ресурс. ЭлементloadClass()метод загрузчика классов выполняет следующие задачи, для того, чтобы при вызове загрузить класс:если класс уже загружен, он возвращает его. В противном случае он делегирует поиск нового класса родительского класса loader. Если загрузчик родительского класса не находит класс,
loadClass()вызывает методfindClass()to найдите и загрузите класс. ЭлементfinalClass()метод ищет класс в текущем загрузчике классов, если класс не был найден загрузчиком родительского класса.
в оригинальной статье также показано, как реализовать собственные загрузчики сетевых классов, что отвечает на ваш вопрос о том, почему (и как). Смотрите также раздел API docs.
большинству разработчиков Java никогда не придется явно использовать загрузчики классов (за исключением загрузки ресурсов, чтобы они все еще работали, когда они упакованы в банки), не говоря уже о написании своих собственных.
загрузчики классов используются в больших системах и серверных приложениях, чтобы делать такие вещи, как:
- модульность системы и загрузка, выгрузка и обновление модулей во время выполнения
- параллельно используйте различные версии библиотеки API (например, синтаксический анализатор XML)
- изолировать различные приложения, работающие в одной JVM (гарантируя, что они не мешают друг другу, например, через статические переменные)
вопрос в том, " почему нужно беспокоиться этот класс ClassLoader существует" ?
Ну, в основном, так что вы можете исправить вещи, если они идут не так :-).
Это правда, пока вы просто пишете приложение, компилируете его в банку и, возможно, включаете несколько дополнительных библиотечных банок, вам не нужно знать о загрузчиках классов, он просто будет работать.
тем не менее, полезно знать немного о загрузчиках классов и загрузке классов, чтобы лучше понять, что происходит на закулисье. Например, "статические инициализаторы" будут запускаться при загрузке класса, поэтому, чтобы понять, когда они будут запускаться, вам нужно знать, как загрузчик классов решает, когда их загружать.
тоже.. как вы используете его на практике ?
для простых случаев они вам не нужны. Однако, если вам нужно динамически загружать код во время выполнения с явным контролем, откуда он берется (например, загрузка по сети, загрузка плагинов, недоступных при компиляции времени и т. д.), возможно, вам придется сделать больше. Затем вы можете, например, написать свой собственный загрузчик классов. См. другие ответы для ссылок.
ClassLoaderв Java-это класс, который используется для загрузки файлов классов в Java. Код Java компилируется в файл класса с помощьюjavacкомпилятор и JVM выполняет программу Java, выполняя байтовые коды, записанные в файле класса.ClassLoader отвечает за загрузку файлов классов из файловой системы, сети или любого другого источника. В Java используется три загрузчика классов по умолчанию,Bootstrap,расширение и система или приложение загрузчика классов.
## ClassLoader взаимодействие с JVM
больше @ : how-classloader-works-in-java.HTML-код
загрузчики классов являются функциональным компонентом JVM, который загружает данные класса из '.файл класса или из сети в область метода в куче.
выглядит как неотъемлемая часть JVM, но как конечный пользователь java, почему я должен быть обеспокоен? Вот почему:
каждый загрузчик классов имеет свое собственное пространство имен, и классы, вызываемые определенным загрузчиком классов, попадают в его пространство имен.
классы, вызываемые двумя разными загрузчиками классов, не будут иметь видимости друг над другом, что приводит к повышению безопасности.
механизм делегирования родительского дочернего загрузчика классов гарантирует, что классы Java api никогда не могут быть взломаны несанкционированным кодом.
для получения дополнительной информации посмотрите здесь
загрузчики классов являются иерархическими. Классы вводятся в JVM, поскольку на них ссылаются по имени в классе, который уже запущен в JVM.
как самый первый класс загружается?
Самый первый класс загружается с помощьюstatic main()метод, объявленный в классе. Все впоследствии загруженные классы загружаются классами, которые уже загружены и запущены.загрузчик классов создает пространство имен. Все JVM включите хотя бы один загрузчик классов, встроенный в JVM, называемый primordial (или bootstrap) загрузчика классов. Это одно, и мы будем смотреть на неоригинальные загрузчики класса. JVM имеет крючки в нем, чтобы позволить определяемым пользователем загрузчикам классов использоваться вместо первоначального загрузчика классов. Вот загрузчики классов, созданные JVM.
Bootstrap (primordial) Этот загрузчик класса не загружается повторно. Загружает внутренние классы JDK, java.* пакеты ( обычно загружает rt.jar и i18n.jar). Вымогательства Этот загрузчик класса не загружается повторно. Загружает файлы jar из каталога расширений JDK (обычно lib/ext JRE). Система Этот загрузчик класса не загружается повторно. Загружает классы из пути системного класса.



Comments