您能告诉我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");
}
}
答案 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。