我不完全确定我是如何处理这种情况的,但不知怎的,我从Thread.getContextClassLoader获得了一个null的ClassLoader。在阅读了一些内容(文档中没有太多信息,也没有google)后,我得到的印象是当前线程有一个空类加载器,并且应该检查对getContextClassLoader的调用是否为空引用。
这是非常令人惊讶的,因为我已经看到几个未经检查的调用getContextClassLoader的开源项目(这让我首先检查了这个)。具体来说,codemodel中的这一行:JCodeModel.java line 358
(我刚刚确认log4j也没有检查)
所以应该调用getContextClassLoader来检查空引用还是搞乱了我的线程?
答案 0 :(得分:3)
Thread.getContextClassLoader
返回null
非常有效。并非所有软件都具有特别好的质量。
虽然null
ClassLoader
通常是指加载系统类的引导类加载器(我认为这是正确的 - 由于历史原因,术语搞砸了),对于线程上下文类加载器,它通常是解释为未设置,而是使用系统类加载器。
java
命令,则将线程上下文类加载器设置为主线程的系统类加载器。对于applet,applet线程和EDT将它设置为applet类加载器。
我建议不要使用线程上下文类加载器(或大多数其他线程本地),除非上下文需要它。
答案 1 :(得分:0)
作为Tom says,Thread.getContextClassLoader()
返回null
完全有效。我隐约回想起默认行为随着时间的推移而发生了变化(或者在各种JVM供应商实现中可能会有所不同 - 我不记得了。)
假设非空上下文ClassLoader
可能有效,如果您在堆栈中设置了一个并且中间没有外部代码,或者类/库合同需要一个。
作为旁注,Class.getClassLoader()也可以返回null
。