Thread.currentThread() 类加载器和普通类加载器之间的区别

2022-09-03 14:23:55

你能告诉我有什么区别,不要将其标记为重复,也请解释并提供我的例子,何时使用这些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()

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

Class#getClassLoader()

返回类的类装入器。某些实现可能用于表示引导类装入器。如果此类是由引导类装入器装入的,则此方法将在此类实现中返回。nullnull


简而言之:

Thread.currentThread().getContextClassLoader() 是使用 setContextClassLoader(ClassLoader cl) 设置的线程的上下文。想象一下,您有一个层次结构为(例如应用程序服务器)的复杂Java应用程序,并且您希望当前线程从此层次结构中的某个特定线程加载类或资源,您可以通过简单地将线程的上下文设置为此特定来执行此操作。ClassLoaderClassLoaderClassLoaderClassLoaderClassLoader

Class#getClassLoader() 只是从中加载的实例。ClassLoaderClass


答案 2

Thread.currentThread().getContextClassLoader()

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

TestServlet.class.getClassLoader()

这是装入 TestServlet 类的类装入器。

请解释并提供我的例子,何时使用这些

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