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

sid*_*ani 11 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");
    }
}
Run Code Online (Sandbox Code Playgroud)

Nic*_*tto 8

Thread.currentThread().getContextClassLoader()

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

Class#getClassLoader()

返回类的类加载器.某些实现可能用于 null表示引导类加载器.null如果此类由引导类加载器加载,则此方法将在此类实现中返回 .


简而言之:

Thread.currentThread().getContextClassLoader()ClassLoader已设置的线程的上下文setContextClassLoader(ClassLoader cl).想象一下,您有一个具有层次结构的复杂Java应用程序ClassLoader(例如Application Server),并且您希望当前线程从此ClassLoader层次结构中的一个特定加载类或资源,您可以通过简单地将ClassLoader线程的上下文设置为这具体ClassLoader.

Class#getClassLoader()只是ClassLoader您的实例Class已加载.


Rub*_*ace 6

Thread.currentThread().getContextClassLoader()

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

TestServlet.class.getClassLoader()

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

请解释并提供示例何时使用这些

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

  • 这应该是公认的答案,因为它解释了为什么在某些情况下必须使用其中一种而不是另一种。 (2认同)