Thread.setContextClassLoader可以设置一个不同于getCCL返回的ClassLoader吗?

时间:2016-01-18 22:14:21

标签: java classloader contextclassloader

背景

最近,我实现了一段代码,用于为特定操作设置appropratie ClassLoader,最后在操作完成后恢复原始的ClassLoader。

例如:

ClassLoader originalCL = Thread.currentThread().getContextClassLoader();
try {
    Thread.currentThread().setContextClassLoader(specialCL);
    // do operation here that requires 'specialCL'
} finally {
    Thread.currentThread().setContextClassLoader(originalCL);
}

根据getContextClassLoader() doc,返回null可能意味着两件事。 1)系统CL或2)如果获得sys CL失败,则引导CL。

  

返回:此Thread的上下文ClassLoader,或null表示系统类加载器(或者,失败,引导类加载器)

根据setContextClassLoader(Classloader cl) doc,如果提供了空CL,那么1)系统CL或2)如果设置sys CL失败,则引导CL。

  

cl - 此Thread的上下文ClassLoader,或null表示系统类加载器(或者,失败,引导类加载器)

问题:

是否有可能使用上面的try-finally-restore编程模型,我最终可能会在Thread上使用与我最初开始时不同的ClassLoader?

例如:

// start out with System CL

ClassLoader original = getContextClassLoader(); // returns null

Thread.currentThread().setContextClassLoader(otherCL);

Thread.currentThread().setContextClassLoader(original); // i.e. set to null
// setCCL() tries to set System CL... fails 
// setCCL() tries to set Bootstrap CL... succeeds

在我们开始使用Bootstrap CL时,当我们尝试使用setContextClassLoader(null)进行恢复时,系统CL也会恢复,这反过来也是如此。是否可能?

1 个答案:

答案 0 :(得分:0)

不,当您将上下文类加载器设置为null时,它只会设置为null。所以它将继续使用它最初使用的任何类加载器。