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

时间:2010-08-11 14:13:57

标签: java multithreading

我不完全确定我是如何处理这种情况的,但不知怎的,我从Thread.getContextClassLoader获得了一个null的ClassLoader。在阅读了一些内容(文档中没有太多信息,也没有google)后,我得到的印象是当前线程有一个空类加载器,并且应该检查对getContextClassLoader的调用是否为空引用。

这是非常令人惊讶的,因为我已经看到几个未经检查的调用getContextClassLoader的开源项目(这让我首先检查了这个)。具体来说,codemodel中的这一行:JCodeModel.java line 358

(我刚刚确认log4j也没有检查)

所以应该调用getContextClassLoader来检查空引用还是搞乱了我的线程?

2 个答案:

答案 0 :(得分:3)

Thread.getContextClassLoader返回null非常有效。并非所有软件都具有特别好的质量。

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

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

我建议不要使用线程上下文类加载器(或大多数其他线程本地),除非上下文需要它。

答案 1 :(得分:0)

作为Tom saysThread.getContextClassLoader()返回null完全有效。我隐约回想起默认行为随着时间的推移而发生了变化(或者在各种JVM供应商实现中可能会有所不同 - 我不记得了。)

假设非空上下文ClassLoader可能有效,如果您在堆栈中设置了一个并且中间没有外部代码,或者类/库合同需要一个。

作为旁注,Class.getClassLoader()也可以返回null