Java 线程上下文类加载器是否可以为null?
我不完全确定我是如何做到这一点的,但不知何故,我从Thread.getContextClassLoader得到了一个空类加载器。在读了一点(文档中或google上没有太多信息)之后,我得到了这样的印象:当前线程有一个空类加载器是有效的,并且应该检查对getContextClassLoader的调用是否有空引用 这是非常令人惊讶的,因为我已经看到了对getContextClassLoader的几个未经检查的开源项目调用(这让我首先检查了这一点)。具体而言,这一行包括: (我刚刚验证了log4j也没有检查)Java 线程上下文类加载器是否可以为null?,java,multithreading,Java,Multithreading,我不完全确定我是如何做到这一点的,但不知何故,我从Thread.getContextClassLoader得到了一个空类加载器。在读了一点(文档中或google上没有太多信息)之后,我得到了这样的印象:当前线程有一个空类加载器是有效的,并且应该检查对getContextClassLoader的调用是否有空引用 这是非常令人惊讶的,因为我已经看到了对getContextClassLoader的几个未经检查的开源项目调用(这让我首先检查了这一点)。具体而言,这一行包括: (我刚刚验证了log4j也没
那么,对getContextClassLoader的调用应该检查空引用还是我的线程出了问题?对于
Thread.getContextClassLoader
返回null
是非常有效的。并不是所有的软件质量都特别好
虽然null
类加载器
通常指加载系统类的引导类加载器(我认为这是对的,术语由于历史原因被弄乱了),但对于线程上下文类加载器,它通常被解释为未设置,而使用系统类加载器
IIRC,如果使用java
命令,线程上下文类加载器被设置为主线程的系统类加载器。对于小程序,小程序线程和EDT将其设置为小程序类加载器
我建议不要使用线程上下文类加载器(或大多数其他线程局部变量),除非上下文需要它。As,它对于thread.getContextClassLoader()
返回null
是完全有效的。我隐约记得默认行为随着时间的推移已经发生了变化(或者在不同的JVM供应商实现中可能有所不同——我记不起来了)
假设一个非空的上下文ClassLoader
可能是有效的,如果您已经在堆栈上进一步设置了一个上下文,并且其间没有外来代码,或者如果类/库契约需要一个
作为旁注,也可以返回
null
。您是否知道当本机线程连接到JVM时,上下文类加载器是否自动修复?我不确定我是如何达到上下文类加载器为空的程度的,因为到目前为止一切都正常。当创建线程时,它继承了当前thread
@Idan K的线程上下文类加载器,那么我想没有一个当前线程可以从中继承任何东西-我不知道这在JNI中是如何实现的(似乎忽略了构造函数,因为它们会NPE(显然第一个线程不能有父线程))。