Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/google-sheets/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 线程上下文类加载器_Java - Fatal编程技术网

Java 线程上下文类加载器

Java 线程上下文类加载器,java,Java,两者的区别是什么 类。getClassLoader()和线程。getContextClassLoader() Class.getClassLoader()返回用于加载特定类的类加载器 getContextClassLoader()获取该线程的类加载器设置为context,用于加载所需的类 例如,在Tomcat中,这会产生不同。对于java.lang.String,类加载器将是顶级JVM类加载器,它不会在类路径上包含所有类,但线程上下文类加载器应该包含这些类。来自: Class.getClassL

两者的区别是什么

类。getClassLoader()和线程。getContextClassLoader()

Class.getClassLoader()返回用于加载特定类的类加载器

getContextClassLoader()获取该线程的类加载器设置为context,用于加载所需的类

例如,在Tomcat中,这会产生不同。对于java.lang.String,类加载器将是顶级JVM类加载器,它不会在类路径上包含所有类,但线程上下文类加载器应该包含这些类。

来自:

Class.getClassLoader()
返回加载调用它的类的
ClassLoader

Thread.getContextClassLoader()
返回
ClassLoader
设置为调用它的
线程的上下文
ClassLoader
,如果线程的
setContextClassLoader(ClassLoader),则它可能不同于加载线程类本身的
ClassLoader
方法已被调用

这可用于允许启动线程的对象指定线程中运行的对象应使用的
类加载器
,但需要这些对象中的某些对象的配合才能工作

如果您想知道为什么会有3个API调用

Thread<instance>.getContextClassLoader()
Thread<instance>.getClassLoader()
Class<instance>.getClassLoader()
Thread.getContextClassLoader()
Thread.getClassLoader()
Class.getClassLoader()
,你可以从中找到答案

为什么线程上下文类加载器首先存在?它们是在J2SE中引入的,没有太多的宣传。Sun Microsystems缺乏适当的指导和文档可能解释了为什么许多开发人员感到困惑

事实上,上下文类加载器为J2SE中引入的类加载委派方案提供了后门。通常,JVM中的所有类加载器都组织在一个层次结构中,这样每个类加载器(除了引导整个JVM的原始类加载器)都有一个父类

[…]
更糟糕的是,某些应用程序服务器将上下文和当前类加载器设置为不同的类加载器实例,这些类加载器实例具有相同的类路径,但与委托父级和子级无关

可能重复的