Разница между загрузчиком классов контекста потока и обычным загрузчиком классов
в чем разница между загрузчиком классов контекста потока и обычным загрузчиком классов?
то есть, если Thread.currentThread().getContextClassLoader() и getClass().getClassLoader() возвращает различные объекты загрузчика классов, которые будут использоваться?
4 ответов:
каждый класс будет использовать свой собственный загрузчик классов для загрузки других классов. Так что если
ClassA.classссылкиClassB.classзатемClassBдолжен быть на пути к классу загрузчика классовClassA, или его родителей.загрузчик классов контекста потока является текущим загрузчиком классов для текущего потока. Объект может быть создан из класса в
ClassLoaderCи затем передается в поток, принадлежащийClassLoaderD. В этом случае объект должен использоватьThread.currentThread().getContextClassLoader()напрямую, если он хочет, чтобы загрузить ресурсы, которые не доступно на собственном загрузчике классов.
есть статья о javaworld.com это объясняет разницу = > какой загрузчик классов следует использовать
(1)
загрузчики классов контекста потока предоставляют задняя дверь вокруг загрузки схема делегирования.
возьмите JNDI, например: его кишки реализовано классами bootstrap в rt.jar (начиная с J2SE 1.3), но эти основные классы JNDI могут загружать JNDI провайдеры, реализованные независимыми продавцы и потенциально развернут в путь к классу приложения. Этот сценарии звонков для родителей загрузчик классов (первичный в в этом случае) для загрузки класса, видимого для один из загрузчиков ребенка ( система один, например). Нормальный J2SE делегирование не работает, а то обходной путь-сделать ядро JNDI классы используют загрузчики контекста потока, таким образом эффективно "прокладывать тоннель" до конца иерархия загрузчиков классов в направление, противоположное правильному делегация.
(2) из того же источника:
эта путаница, вероятно, останется с Ява на некоторое время. Возьмите любой в J2SE API-интерфейс с динамической загрузкой ресурса любого вид и попробуйте угадать, какая загрузка стратегию он использует. Вот примеры:
- JNDI использует контекстные загрузчики классов
- класса.getResource () и класс.forName () используйте текущий загрузчик классов
- JAXP использует контекстные загрузчики классов (по состоянию на J2SE 1.4)
- java.утиль.ResourceBundle использует текущий загрузчик классов вызывающего объекта
- обработчики протокола URL, указанные через java.протокол.обработчик.системное свойство pkgs просматривается только в загрузчиках bootstrap и system classloaders
- JAVA Serialization API использует текущий загрузчик классов вызывающего объекта по умолчанию
это не ответ на исходный вопрос, но как вопрос сильно занимает и связан для любого
ContextClassLoaderquery, я думаю, что важно ответить на связанный с этим вопрос о том, когда должен использоваться загрузчик классов контекста. Короткий ответ: никогда не используйте загрузчик классов контекста! Но установите его вgetClass().getClassLoader()когда вы должны вызвать метод, который отсутствует
добавление к ответу @ David Roussel, классы могут быть загружены несколькими загрузчиками классов.
давайте разберемся как загрузчика класс строительство.
из блога javin paul в javarevisited:
ClassLoaderследует трем принципам.принцип делегирования
класс загружается в Java, когда это необходимо. Предположим, у вас есть конкретный класс приложения под названием Abc.класс, первый запрос загрузки этот класс придет в приложение ClassLoader, которое делегирует его родительскому расширению ClassLoader, который далее делегирует в Primordial или Bootstrap class loader
Загрузчик Классов Bootstrap отвечает за загрузку стандартных файлов класса JDK из rt.jar и это родитель всех загрузчиков классов в Java. Загрузчик класса нет родители.
Extension ClassLoader делегирует запрос на загрузку класса своему родителю, Bootstrap и, если это не удается, загружает каталог класса jre/lib/ext или любой другой каталог, на который указывает java.доб.система Дирс собственность
загрузчик классов систем или приложений и он отвечает за загрузку конкретных классов приложений из переменной среды CLASSPATH,- classpath или-CP параметр командной строки, Атрибут Class-Path файла манифеста внутри JAR.
загрузчик классов приложений ребенок Extension ClassLoader и его реализация
sun.misc.Launcher$AppClassLoaderкласса.Примечание: за исключением загрузчик класса Bootstrap, который реализован на родном языке в основном на C, все загрузчики классов Java реализованы с использованием
java.lang.ClassLoader.видимость Принцип
согласно принципу видимости, Child ClassLoader можно увидеть класс, загруженный Родительский Загрузчик Классов но это не так.
Принцип Уникальности
согласно этому принципу класс, загруженный родителем, не должен загружаться дочерним загрузчиком классов снова


Comments