Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ionic-framework/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
什么是Java中的独立类加载器?_Java_Classloader - Fatal编程技术网

什么是Java中的独立类加载器?

什么是Java中的独立类加载器?,java,classloader,Java,Classloader,在试图解决这个问题时,我遇到了一些文章,等等,这些文章提到了“孤立的”类加载器。我无法通过谷歌搜索找到孤立类加载器的定义,所以这个术语可能不是广为人知的行话,在不同的上下文中可能有不同的含义 无论如何,Maven的surefire插件可以使用一个独立的类加载器: 下面的答案也是参考文献之一 上面的参考文献都没有给出独立类加载器的定义;他们似乎认为读者知道这意味着什么,或者可以查找它。然而,第二个链接确实包含了一个关于“隔离”含义的提示: 引导允许您在不污染系统类路径的情况下运行容器。这允许您以未

在试图解决这个问题时,我遇到了一些文章,等等,这些文章提到了“孤立的”类加载器。我无法通过谷歌搜索找到孤立类加载器的定义,所以这个术语可能不是广为人知的行话,在不同的上下文中可能有不同的含义

无论如何,Maven的surefire插件可以使用一个独立的类加载器:

下面的答案也是参考文献之一

上面的参考文献都没有给出独立类加载器的定义;他们似乎认为读者知道这意味着什么,或者可以查找它。然而,第二个链接确实包含了一个关于“隔离”含义的提示:

引导允许您在不污染系统类路径的情况下运行容器。这允许您以未受污染的系统类路径作为其父级运行已部署的应用程序您已经实现了类加载器隔离。

但我不太清楚从这一段或文章的其余部分中,什么是孤立的,如何孤立的。我看到他正在加载一个类的一个版本,而不是覆盖另一个版本——也许一个类加载器是不同的实例,而一个是另一个的父实例,从而与另一个类加载器隔离?我不确定


我特别垂涎一个谷歌左右的搜索链接,其中包含一个明确包含答案的链接。直接链接到答案也有效。:)

在这里,您可以随时创建一个无污染的系统类路径,用于引导Java程序。

作者使用术语“隔离”基本上是指JVM的引导类加载器(“主”类加载器)中没有任何额外的JAR/类(只有一个简单的类,它反过来设置了子类加载器。)这篇文章并不清楚为什么它是“隔离的”,因为它只设置了一个子类加载器当您设置多个子类加载器时,这个术语变得更加明显。这些子类将彼此隔离,因为它们不会共享任何类(核心JRE类除外)因此,您可以让每个孩子使用同一个jar的不同版本。

根据我在文章中的理解,您链接到一个独立的类加载器是一个独立于主系统类加载器的类加载器。也就是说,独立类加载器加载的类不会对JRE中的每个类都可用(只有独立类装入器自己装入的类[以及任何子类装入器装入的任何类])


这可能很有用,因为您的两个依赖项可能需要运行同一库的不同版本。也就是说,您的依赖项可能希望在库中看到同一类的不同实例化。因此,为它们提供两个单独的独立类装入器将允许它们加载所需的类,而不会干扰它们彼此。

默认情况下,类加载器形成一棵树,系统类加载器位于根。默认情况下,新的子类加载器将首先询问其父类是否可以加载该类,如果不能,则从其自己的源加载

隔离类加载器的目标是通过先检查自己的源,然后检查父类加载器,从而将自己与父类加载器隔离,从而颠倒顺序。这允许您创建一个新的类加载上下文,您可以在其中控制要查看的第一个位置。您仍然希望回退到父链,以便可以加载类似于jdk等

您还需要注意,隔离类加载器返回父类加载器中定义的接口实例,否则您将遇到LinkageErrors或其他问题

这是我在2006年写的一篇文章,但它仍然相当相关(它在资源加载方面是不完整的,API在过去几年中有一些变化):


请提供一个链接或引用,为您的问题提供上下文。(顺便说一句,贪婪不是一种罪恶吗?:-)@斯蒂芬:如果你进来时把你的宗教狂热留在外面,我们会很感激的。好吧,我们从拉里·沃尔那里知道,程序员的三大美德是懒惰、不耐烦和傲慢,既然贪婪不是一种美德,那一定是一种罪恶。那么你就去吧。@MattiVirkkunen-我建议你查一下“:-”的意思。也许你需要拒绝你自己的反宗教狂热设置。@StephenC我用上下文更新了我的问题。这实际上是我在试图查找什么是孤立类加载器时读到的文章之一,从上下文我不清楚它是什么。我知道作者在做什么,但我不知道是什么让他的类加载器“孤立”了;classloader2=新的URLClassLoader(另一个URL,父URL);将创建2个与ea隔离的类加载器。另一个,每一个都能够拥有给定类的不同版本(可能还有其他用途),对吗?@apollodude217-是的,这是正确的。然而,关键是一个URL和另一个URL都不应该引用父类加载器加载的类(因此示例运行主类加载器时没有额外的JAR)。