Thread.currentThread()classLoader与普通classLoader之间的区别

时间:2016-10-28 10:44:47

标签: java multithreading 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");
    }
}

2 个答案:

答案 0 :(得分:7)

<强> Thread.currentThread().getContextClassLoader()

  

返回上下文   这个ClassLoader Thread。上下文ClassLoader由提供   线程的创建者,供在此线程中运行的代码使用   加载类和资源。如果未设置,则默认为   父线程的ClassLoader上下文。上下文ClassLoader   原始线程通常设置为用于的类加载器   加载应用程序。

<强> Class#getClassLoader()

  

返回类的类加载器。一些实现可能会使用   null表示引导类加载器。这个方法会返回   如果此类由引导程序加载,则在此类实现中null   类加载器。

简而言之:

Thread.currentThread().getContextClassLoader()是已使用setContextClassLoader(ClassLoader cl)设置的线程上下文的ClassLoader。想象一下,您有一个层次结构为ClassLoader的复杂Java应用程序(例如Application Server),并且您希望当前线程从此层次结构中的一个特定ClassLoader加载类或资源,您可以执行此操作它只需将线程的上下文ClassLoader设置为此特定ClassLoader

Class#getClassLoader()只是加载了ClassLoader实例的Class

答案 1 :(得分:2)

  

Thread.currentThread()。getContextClassLoader()

这是当前的线程类加载器,并不依赖于调用它的类

  

TestServlet.class.getClassLoader()

这是加载TestServlet类的类加载器。

  

请解释并向我提供何时使用这些

的示例

让我们假设您拥有ClassLoader1拥有的Thread1和ClassLoader2拥有的Thread2。您可以在Thread2上加载TestServlet类(通过ClassLoader2),然后将其传递给Thread1。此时,如果TestServlet需要加载ClassLoader1拥有的Class,则需要使用Thread.currentThread()。getCotextClassLoader(),因为它自己的ClassLoader是ClassLoader2而不是ClassLoader1。