我正在使用URLClassLoader
从外部jar文件加载类,由此加载的类可能已经存在于我的Web应用程序类加载器中,假设URL类加载器已加载版本1的类A,而Web应用程序已加载了版本2的同一类A,由web应用程序启动的新线程需要类A,是否可以从UrlClassloader获得A而不是从Web应用程序类加载器?如果是这样,如何避免这种情况,如何限制urlclassloader类的作用域仅在特定方法中使用?
请建议将类加载器设置为
Thread.currentThread()。getContextClassLoader();
我处理来自该类加载器的类的工作,一旦完成,将其替换为旧的类加载器吗?
ClassLoader oldLoader=Thread.currentThread().getContextClassLoader();
Thread.currentThread().setContextClassLoader(classLoader);
try{
siClass=classLoader.loadClass("tools.ds.Signature3");
result=doWork();
}catch(Exception e){
throw new RuntimeException(e);
}finally{
Thread.currentThread().setContextClassLoader(oldLoader);
}
return result;
这样我是否将classLoader的范围仅限制为doWork()操作?
最佳答案
答案在Thread.getContextClassLoader()
的javadoc中:
返回此线程的上下文ClassLoader。线程的创建者提供了上下文ClassLoader,供加载类和资源时在此线程中运行的代码使用。如果未设置,则默认值为父线程的ClassLoader上下文。通常将原始线程的上下文ClassLoader设置为用于加载应用程序的类加载器。
因此,如果您没有弄乱该URLClassLoader
,它应该不会影响您的线程。