我使用URLClassLoader从外部jar文件加载类,由它加载的类可能已经存在于我的web应用类加载器中,假设URL类加载器加载了版本1的类A,web应用程序已经用version2加载了相同的类A,这是由web应用程序需要类A启动的一个新线程,它能从UrlClassloader获得A而不是webapplication类加载器吗?如果是这样,我如何避免这种情况,如何将urlclass加载器类范围限制为仅在特定方法中服务?
请建议将类加载程序设置为
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()操作上?
发布于 2015-06-16 21:56:39
答案在Thread.getContextClassLoader()的javadoc中。
返回此线程的上下文ClassLoader。上下文ClassLoader由线程的创建者提供,供在此线程中运行的代码在加载类和资源时使用。如果未设置,则默认为父线程的ClassLoader上下文。原始线程的上下文ClassLoader通常设置为用于加载应用程序的类加载器。
因此,如果您没有处理这个URLClassLoader,那么它不应该影响您的线程。
https://stackoverflow.com/questions/30878884
复制相似问题