Зачем нам нужен contexClassLoader
Мне интересно, почему Java представила contexClassLoader для потоков. Я знаю, что он обычно используется фреймворками и серверами приложений, которые должны динамически находить и загружать классы.
Однако я не понимаю, почему Java ввела contexClassLoader, когда мы можем достичь той же функциональности, просто добавив поле, которое будет содержать необходимый загрузчик классов.
class ThreadWithCustomClassloader extends Thread
{
ClassLoader threadClassLoader;
public void run()
{
//use threadClassLoader to dynamically find and load classes
}
}
2 ответа
Механизм загрузчика классов по умолчанию в JVM - родительское делегирование, загрузчики классов контекста потока обеспечивают черный ход вокруг схемы делегирования загрузки классов. Возьмем, к примеру, JNDI: его внутренности реализованы классами начальной загрузки в rt.jar (начиная с J2SE 1.3), но эти основные классы JNDI могут загружать поставщиков JNDI, реализованных независимыми поставщиками и потенциально развернутых в -classpath приложения. В этом сценарии родительский загрузчик классов (в данном случае первичный) загружает класс, видимый одному из его дочерних загрузчиков классов (например, системный). Обычное делегирование J2SE не работает, и обходной путь состоит в том, чтобы основные классы JNDI использовали загрузчики контекста потока, таким образом эффективно "туннелируя" через иерархию загрузчика классов в направлении, противоположном правильному делегированию.
Для получения дополнительной информации, пожалуйста, проверьте, какой загрузчик классов вы должны использовать
Я запутался - наличие переменной экземпляра для загрузчика классов - это именно то, что класс Thread использует для реализации этого. Что отличается в вашем решении?
Вы не возражаете против сеттера? Установка загрузчика классов важна для возможности повторного использования одного и того же потока (например, в контейнере сервлета) для совершенно другой среды (веб-приложения). Нитки считаются дорогими...