背景
最近,我实现了一段代码,用于为特定操作设置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也会恢复,这反过来也是如此。是否可能?
答案 0 :(得分:0)
不,当您将上下文类加载器设置为null
时,它只会设置为null
。所以它将继续使用它最初使用的任何类加载器。