2016-10-28 4 views
5

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

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"); 
    } 
} 
+2

Фактически это [дубликат] (http://stackoverflow.com/questions/1771679/difference-between-threads-context-class-loader-and-normal-classloader/1772346) – nandsito

+0

«не отмечайте его как дубликат «если вы знаете, что это дубликат, то ясно [поделиться своим исследованием] (http://stackoverflow.com/help/how-to-ask). Ссылка на [duplicate] (http://stackoverflow.com/help/duplicates) и объясните, как он отличается от вашего вопроса. Между тем, я отметил это как дубликат ... (Btw, давая команды, такие как «не отмечайте ...», можно считать грубым.) –

ответ

4

Thread.currentThread().getContextClassLoader()

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

Class#getClassLoader()

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


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

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

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

1

Thread.currentThread(). GetContextClassLoader()

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

TestServlet.class.getClassLoader()

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

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

Давайте представим, вы Резьба1 принадлежит ClassLoader1 и thread2 принадлежит ClassLoader2. Возможно, вы загрузите свой класс TestServlet в Thread2 (по ClassLoader2), а затем передайте его в Thread1. В этот момент, если TestServlet необходимо загрузить класс, принадлежащий ClassLoader1, ему нужно будет использовать Thread.currentThread(). GetCotextClassLoader(), так как собственный ClassLoader - ClassLoader2, а не ClassLoader1.

+0

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

Смежные вопросы