当前位置: 首页 > 知识库问答 >
问题:

UrlClassLoader作用域

轩辕晔
2023-03-14

我正在使用UrlClassloader从外部jar文件加载类,这个加载的类可能已经存在于我的web应用程序类加载器中,假设URL类加载器加载了版本1的类A,而webapplication已经加载了版本2的类A,由webapplication启动的一个新线程需要类A,这个可以从UrlClassloader而不是webapplication类加载器获得A吗?如果是的话,我该如何避免这种情况呢?我该如何限制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;

这样我是不是把类加载器的作用域限制在doWork()操作上了?

共有1个答案

公良云
2023-03-14

答案在Thread.GetContextClassLoader()的javadoc中:

返回此线程的上下文类加载器。上下文类加载器由线程的创建者提供,供在此线程中运行的代码加载类和资源时使用。如果未设置,则默认值为父线程的类加载器上下文。原始线程的上下文类加载器通常设置为用于加载应用程序的类加载器。

因此,如果您没有使用URLClassLoader,它应该不会影响您的线程。

 类似资料:
  • 我正试图通过服务提供者API在运行时由加载一个jar。然而,结果却是失败的。 以下是我所做的: null 我尝试了抽象类而不是我的SPI接口的接口,当我无法实现我的目标时,将它改回接口; 我已尝试获取资源并将我的作为输入参数传递,但没有工作; 我尝试了Apache实现的,但它也找不到适当的资源; 我的问题是如何通过从外部jar加载资源?SPI可能是一种解决方案吗?

  • 问题内容: 我在玩反射,我想做点东西来加载一个类并打印该类中所有字段的名称。我制作了一个小型的hello world类型的类来检查一些东西: 基于以上所述,我得出两个结论: 它存在于/home/kent/eclipsews/SmallExample/bin/IndependentClass.class 有用!(因此它必须是可以由类加载器加载的正确的.class文件) 然后使用反射的代码:(标记导致

  • 好的,基本上,我尝试使用这里描述的方法JarFileLoader来加载一个jar,其中包含一个类,该类的使用方式与类路径上的相同(类名将是动态的,因此我们可以添加任何jar任何类和程序将通过解析文本文件加载它,在主线中)。 问题是当我调试和检查URLClassLoader对象时 行: getResource()在参数中找不到类名。 有人已经尝试过用这种方式加载jar文件了吗? 谢谢。 加载器: 主

  • 问题内容: 我有一个类,位于package中,我使用URLClassLoader加载该类。但是,当我从位于同一包中的另一个类调用它时,我无法访问具有默认访问修饰符的方法(我可以访问公共方法)。 我得到以下异常: java.lang.IllegalAccessException:类javaapplication4.Test1无法访问带有修饰符“”的类javaapplication4.Formula的

  • 问题内容: 我需要为应用程序的某些部分向现有应用程序添加插件功能。我希望能够在运行时添加jar,并且应用程序应该能够从jar中加载类,而无需重新启动应用程序。到目前为止,一切都很好。我使用URLClassLoader在线找到了一些示例,并且运行良好。 我还希望能够在罐子的更新版本可用时重新加载相同的类。我再次发现了一些示例,据我所知,实现此目标的关键是我需要为每个新负载使用一个新的类加载器实例。

  • 问题内容: 我已经创建了自己的文件,并通过将其设置为系统类加载器。它已经初始化,并且一切正常,但是找不到我要加载的类。这是: 我已确认该罐子存在,并且路径正确。这是我在程序中如何称呼它: 这是我得到的例外(第166行是指我尝试创建新行的行: 我什至尝试像这样显式加载类: 是什么原因造成的?它不应该“正常工作”吗? 更新: 这是来自的重要代码 更新2: 这是一个SSCCE:http : //nucl