首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Thread.currentThread() classLoader与普通classLoader的区别

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

Stack Overflow用户
提问于 2016-10-28 18:44:47
回答 2查看 10.8K关注 0票数 14

您能告诉我Thread.currentThread().getContextClassLoader()TestServlet.class.getClassLoader()之间的区别吗?请不要将其标记为重复,并请解释并举例说明何时使用它们

Java文件:

代码语言:javascript
复制
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");
    }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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

票数 11
EN

Stack Overflow用户

发布于 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。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40303433

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档