您能告诉我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");
}
}发布于 2016-10-28 19:03:54
Thread.currentThread().getContextClassLoader()
返回此
Thread的上下文ClassLoader。上下文ClassLoader由线程的创建者提供,供在此线程中运行的代码在加载类和资源时使用。如果未设置,则默认为父线程的ClassLoader上下文。原始线程的上下文ClassLoader通常设置为用于加载应用程序的类加载器。
Class#getClassLoader()
返回类的类加载器。一些实现可能使用
null来表示引导类加载器。在这种实现中,如果该类是由引导类加载器加载的,则此方法将返回null。
简而言之,:
Thread.currentThread().getContextClassLoader()是使用setContextClassLoader(ClassLoader cl)设置的线程上下文的ClassLoader。假设您有一个层次结构为ClassLoader的复杂java应用程序(例如,application Server),并且您希望当前线程从此层次结构中的一个特定ClassLoader加载类或资源,只需将线程的上下文ClassLoader设置为此特定ClassLoader即可。
Class#getClassLoader()只是从中加载Class实例的ClassLoader。
发布于 2016-10-28 19:09:29
Thread.currentThread().getContextClassLoader()
这是当前线程类加载器,并不依赖于调用它的类
TestServlet.class.getClassLoader()
这是加载TestServlet类的类加载器。
请解释并举例说明何时使用这些工具
假设Thread1归ClassLoader1所有,Thread2归ClassLoader2所有。您可以将TestServlet类加载到Thread2上(通过ClassLoader2),然后将其传递给Thread1。此时,如果TestServlet需要加载ClassLoader1拥有的类,它将需要使用Thread.currentThread().getContextClassLoader(),,因为它自己的ClassLoader是ClassLoader2而不是ClassLoader1。
https://stackoverflow.com/questions/40303433
复制相似问题