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)
Thread.currentThread().getContextClassLoader()
返回上下文
ClassLoader
此Thread
.上下文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
已加载.
Thread.currentThread().getContextClassLoader()
这是当前线程类加载器,不依赖于调用它的类
TestServlet.class.getClassLoader()
这是加载 TestServlet 类的类加载器。
请解释并提供示例何时使用这些
假设您有 ClassLoader1 拥有的 Thread1 和 ClassLoader2 拥有的 Thread2。您可以在 Thread2 上加载 TestServlet 类(通过 ClassLoader2),然后将其传递给 Thread1。此时,如果 TestServlet 需要加载 ClassLoader1 拥有的类,它将需要使用 Thread.currentThread().getContextClassLoader(),因为它自己的 ClassLoader 是 ClassLoader2 而不是 ClassLoader1。