Разница между Thread.currentThread() classLoader и обычным classLoader

Можете ли вы сказать мне, в чем разница между Thread.currentThread().getContextClassLoader() и TestServlet.class.getClassLoader(), не помечать его как дублирующее, а также объяснять, а также дать мне пример, когда использовать эти

Файл Java:

package com.jar.test;

public class TestServlet {
    public static void main(String args[]) {    
        ClassLoader cls = TestServlet.class.getClassLoader().loadClass(
                "com.jar.test.TestServlet");
        ClassLoader cls = Thread.currentThread().getContextClassLoader()
                .loadClass("com.jar.test.TestServlet");
    }
}

Ответ 1

Thread.currentThread().getContextClassLoader()

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

Class#getClassLoader()

Возвращает загрузчик класса для класса. Некоторые реализации могут использовать null для представления загрузчика классов начальной загрузки. Этот метод вернет null в таких реализациях, если этот класс был загружен загрузчиком загрузчик классов.


В двух словах:

Thread.currentThread().getContextClassLoader() - это ClassLoader контекста потока, который был установлен с помощью setContextClassLoader(ClassLoader cl). Представьте, что у вас есть сложное Java-приложение с иерархией ClassLoader (например, Сервер приложений), и вы хотите, чтобы ваш текущий поток загружал классы или ресурсы из одного конкретного ClassLoader в этой иерархии, вы можете сделать это, просто установив контекст ClassLoader потока для этого конкретного ClassLoader.

Class#getClassLoader() - это просто ClassLoader, из которого был загружен ваш экземпляр Class.

Ответ 2

Thread.currentThread().getContextClassLoader()

Это текущий загрузчик классов потока и не зависит от класса, который его называет

TestServlet.class.getClassLoader()

Это загрузчик классов, который загрузил класс TestServlet.

объясните, а также приведите пример использования этих

Предположим, у вас есть Thread1, принадлежащий ClassLoader1, и Thread2, принадлежащий ClassLoader2. Возможно, вы загрузите свой класс TestServlet в Thread2 (с помощью ClassLoader2) и затем передадите его в Thread1. В этот момент, если TestServlet необходимо загрузить Class, принадлежащий ClassLoader1, ему нужно будет использовать Thread.currentThread(). GetContextClassLoader(), поскольку его собственный ClassLoader является ClassLoader2, а не ClassLoader1.