线程上下文类加载器可以为null吗?

4
我不确定自己是如何陷入这种情况的,但不知何故,我从Thread.getContextClassLoader中得到了一个空ClassLoader。阅读了一些资料(文档和谷歌上都没有太多信息),我得出的印象是当前线程有一个空class loader是有效的,并且应该检查getContextClassLoader的调用是否为空引用。
这非常令人惊讶,因为我看到了一些开源项目未经检查地调用getContextClassLoader(这也是我首次检查它的原因)。具体来说,codemodel中的这行代码:JCodeModel.java line 358 (我刚刚验证了log4j也没有检查)
所以,对getContextClassLoader的调用是否应检查空引用,还是我的线程出了问题?
2个回答

3
< p > Thread.getContextClassLoader 返回 null 是有效的。并非所有软件都是特别优秀的。

虽然 null ClassLoader 通常指加载系统类的引导类加载器(我认为这是正确的 - 术语因历史原因而混乱),但对于线程上下文类加载器,它通常被解释为未设置,并且使用系统类加载器代替。

IIRC,如果使用 java 命令,则主线程的线程上下文类加载器设置为系统类加载器。对于小程序,小程序线程和EDT将其设置为小程序类加载器。

除非上下文需要,否则建议不要使用线程上下文类加载器(或大多数其他线程局部变量)。


你是否知道当本机线程附加到JVM时,上下文类加载器是否会自动修复?我不确定为什么上下文类加载器变为null,因为之前一切都是正常工作的。 - Idan K
当创建一个Thread时,它会继承当前Thread的线程上下文类加载器。 - Tom Hawtin - tackline
@Idan K 那么我猜现在没有线程可以继承任何东西 - 我不熟悉JNI中这是如何实现的(似乎忽略了构造函数,因为它们会导致NPE(显然,第一个线程不能有父线程))。 - Tom Hawtin - tackline

0

Tom说Thread.getContextClassLoader() 返回 null 是完全合法的。我模糊地记得默认行为随着时间的推移已经改变了(或者在各种 JVM 供应商实现中可能不同 - 我记不清了)。

如果您在堆栈上设置了一个 ClassLoader 并且没有外部代码介入,或者类/库合同要求使用 ClassLoader,则假定非空上下文 ClassLoader 可能是有效的。

另外,Class.getClassLoader() 也可能返回 null


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接