Почему метод setContextClassLoader () размещается в потоке? - PullRequest
7 голосов
/ 22 марта 2010

Почему метод setContextClassLoader() размещен на Thread?

Какие разные потоки имеют разные загрузчики классов?

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

Теперь я хочу, чтобы это был контекстный загрузчик классов, поэтому я вызываю метод Thread.currentThread().setContextClassLoader(loader).

Доступны ли эти новые классы только в контексте текущего потока? Или как это работает?

Спасибо

Ответы [ 4 ]

8 голосов
/ 22 марта 2010

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

2 голосов
/ 13 декабря 2016

Thread.setContextClassLoader используется для установки contextClassLoader, если не установлен вручную, для него будет установлено значение systemClassLoader, равное Launcher.AppClassLoader, это можно проверить, проверив исходный код Launcher. enter image description here

Тогда в чем смысл contextClassLoader?

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

Тогда возникает вопрос: зачем нам эта задняя дверь?

Из статьи JavaWorld Найдите выход из лабиринта ClassLoader

Взять, к примеру, JNDI: его внутренности реализованы классами начальной загрузки в rt.jar (начиная с J2SE 1.3), но эти основные классы JNDI могут загружать провайдеров JNDI, реализованных независимыми поставщиками и потенциально развернутых в -classpath приложения , В этом сценарии родительский загрузчик классов (в данном случае первичный) загружает класс, видимый одному из его дочерних загрузчиков классов (например, системный). Обычное делегирование J2SE не работает, и обходной путь должен заставить основные классы JNDI использовать загрузчики контекста потока , таким образом эффективно "туннелируя" через иерархию загрузчика классов в направлении, противоположном правильному делегированию.

2 голосов
/ 22 марта 2010

Загрузчик класса контекста потока немного взломан.

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

Thread.setContextClassLoader используется для установки загрузчика класса на Thread.getContextClassLoader.Это используется случайными API (в частности, через ServiceLoader), чтобы выбрать классы с помощью отражения, чтобы вы могли изменить реализацию.Плохая идея - когда реализации меняются из-за кода, в зависимости от того, в каком потоке он работает в критический момент.

0 голосов
/ 21 июля 2016

Загрузчики классов Java можно разделить на следующие категории

1) Загрузчик классов начальной загрузки
Загрузка классов из JAVA_HOME / jre / lib / rt.jar

2) Загрузчик класса расширений <
Загрузка классов из JAVA_HOME / jre / lib / ext

3) Системный загрузчик классов
Путь к классу приложения

Мы можем создать собственный загрузчик классов и указать собственное местоположение, из которого классы могут быть загружены, то есть обратитесь к ContextClassLoader

Надеюсь, что это дает представление о том, почему нам нужно использовать setContextClassLoader ()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...