有什么区别?
Class.getClassLoader()和Thread.getContextClassLoader()?
答案 0 :(得分:7)
来自this thread:
Class.getClassLoader()
返回加载了它所调用的类的ClassLoader
。
Thread.getContextClassLoader()
返回ClassLoader
集作为调用它的ClassLoader
的上下文Thread
,这可能与加载了ClassLoader
的{{1}}不同如果调用了线程的setContextClassLoader(ClassLoader)
方法,则线程类本身。这可以用于允许启动线程的对象指定线程中运行的对象应该使用的
ClassLoader
,但是需要这些对象的合作才能使用。
因此,如果您想知道为什么有3个API调用
Thread<instance>.getContextClassLoader()
Thread<instance>.getClassLoader()
Class<instance>.getClassLoader()
,您可以在此Find a way out of the ClassLoader maze找到答案。
为什么首先存在线程上下文类加载器?它们在J2SE中引入而没有大张旗鼓。 Sun Microsystems缺乏适当的指导和文档可能解释了为什么许多开发人员发现它们令人困惑。
实际上,上下文类加载器为J2SE中引入的类加载委托方案提供了一个后门。通常,JVM中的所有类加载器都按层次结构组织,这样每个类加载器(引导整个JVM的原始类加载器除外)都有一个父类。
[...]
更糟糕的是,某些应用程序服务器将上下文和当前类加载器设置为具有相同类路径且尚未作为委托父级和子级关联的不同ClassLoader实例。
答案 1 :(得分:3)
Class.getClassLoader()返回用于加载该特定类的类加载器。
Thread.getContextClassLoader()将ClassLoader设置为该线程的 context ,该线程将用于加载所需的类。
这在Tomcat中有所不同。对于java.lang.String,类加载器将是顶级JVM类加载器,它不会在类路径上包含所有类,但Thread上下文类加载器应该这样做。