我正在使用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,它应该不会影响您的线程。

10-08 11:45