背景:
最近我实现了一段代码,它将为特定操作设置适当的ClassLoader,并在操作完成后最终恢复原来的ClassLoader。
例如:
ClassLoader originalCL = Thread.currentThread().getContextClassLoader();
try {
Thread.currentThread().setContextClassLoader(specialCL);
// do operation here that requires 'specialCL'
} finally {
Thread.currentThread().setContextClassLoader(originalCL);
}
根据getContextClassLoader()
文档,返回的 null 可能意味着两件事。1) 系统 CL 或 2) 如果获取 sys CL 失败,则引导 CL。
返回:此线程的上下文 ClassLoader,或 null 指示系统类加载器(或者,如果失败,则为引导类加载器)
根据setContextClassLoader(Classloader cl)
文档,如果提供了空 CL,则 1)系统 CL 或 2)如果设置 sys CL 失败,则引导 CL。
cl - 此线程的上下文 ClassLoader,或 null 指示系统类加载器(或者,如果失败,则为引导类加载器)
问题:
是否有可能使用上面的 try-finally-restore 编程模型,我最终会在线程上使用与最初开始时不同的 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
setContextClassLoader(null)
在我们从 Bootstrap CL 开始以及当我们尝试使用System CL 恢复时,情况也可能相反。两种情况都有可能吗?