代码之家  ›  专栏  ›  技术社区  ›  Idan K

线程上下文类加载器是否可以为空?

  •  3
  • Idan K  · 技术社区  · 14 年前

    我不完全确定如何处理这种情况,但不知何故,我从thread.getContextClassLoader中得到了一个空的类加载器。在阅读了一点(文档和谷歌上的信息都不多)之后,我觉得当前线程使用空类加载器是有效的,并且应该检查对getContextClass加载器的调用是否有空引用。

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

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

    那么,对getContextClassLoader的调用应该检查空引用还是我的线程有问题?

    2 回复  |  直到 14 年前
        1
  •  3
  •   Tom Hawtin - tackline    14 年前

    它对 Thread.getContextClassLoader 归来 null . 并不是所有的软件都有特别好的质量。

    同时 无效的 ClassLoader 通常是指加载系统类的引导类加载器(我认为这是对的——术语由于历史原因而混乱了),对于线程上下文类加载器,它通常被解释为unset,而使用系统类加载器。

    IIRC,如果使用 java 命令。对于小程序,小程序线程和EDT将其设置为小程序类加载器。

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

        2
  •  0
  •   Community CDub    7 年前

    AS Tom says ,它完全适用于 Thread.getContextClassLoader() 归来 null . 我隐约记得,默认行为随着时间的推移而改变(或者它在各种JVM供应商实现中可能是不同的——我不记得了)。

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

    作为旁注, Class.getClassLoader() 可以返回 无效的 也是。