如何理解


  在多线程环境中,由于不同的类加载器,您可能会有类型转换异常


我看到了有关此内容的Spring源代码:

public static ClassLoader getDefaultClassLoader() {
    ClassLoader classLoader = null;
    try {
        classLoader = Thread.currentThread().getContextClassLoader();
    } catch (Throwable ex) {
        ex.printStackTrace();
    }
    if (classLoader == null) {
        // No thread context class loader -> use class loader of this class
        classLoader = ClassUtil.class.getClassLoader();
        if (classLoader == null) {
            // getClassLoader() returning null indicates the bootstrap ClassLoader
            try {
                classLoader = ClassLoader.getSystemClassLoader();
            } catch (Throwable ex) {

            }
        }
    }
    return classLoader;
}


我为什么不选择Thread.currentThread()。getContextClassLoader()作为首选?

有人告诉我,在多线程中类加载器的行为可能有所不同

老实说,我听不懂

最佳答案

Thread.currentThread()。getContextClassLoader()是自然的首选,因此不同的上下文可以可靠地设置其私有类加载器重写。尽管大多数情况下,额外的类加载器用于加载较低级别的类加载器未提供的类,但另一种用法是在某些情况下使用某些类的特定实现。

当这与一个类的类型标识包含已加载该类的类加载器的事实结合时,就有可能具有两个相同(绝对)类名的类,而这些类仍然不是同一类型。

09-30 17:31
查看更多