Java中什么是隔离的类加载器?

问题描述 投票:11回答:4

[当尝试解决this problem时,我遇到了一些文章等,它们指的是“隔离的” ClassLoader。我无法通过Google搜索找到isolated classloader的定义,因此该术语可能不是广为人知的行话,并且在不同的上下文中可能具有不同的含义。

无论如何,Maven的surefire插件可以使用隔离的ClassLoader:http://maven.apache.org/plugins/maven-surefire-plugin/examples/class-loading.html

也是以下参考文献an article explaining how to create an "isolated" ClassLoader的答案之一。

以上参考均未提供隔离的ClassLoader的定义;他们似乎假设读者知道这意味着什么或可以查找它。但是,第二个链接确实暗示了“ isolated”的含义:

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

但是我不清楚本段或本文其余部分与什么以及如何分离。我看到他正在加载一个类的一个版本而不会覆盖/覆盖另一个版本-也许一个类加载器通过被不同的实例与另一个实例隔离而没有一个实例是另一个实例的父级?我不确定。

我特别希望Google或SO搜索链接包含明确包含答案的链接。与答案的直接链接也有效。 :)

java classloader
4个回答
10
投票

作者使用术语“隔离”基本上是指JVM的引导类加载器(“主”类加载器)中没有任何额外的jar /类(只是一个简单的类,该类又设置了子类加载器)。关于这是为什么被“隔离”的原因,本文并不十分清楚,因为它仅设置了一个子类加载器。当您设置多个]子类加载器时,“隔离”一词将变得更加明显。这些子级将彼此隔离,因为它们将不共享any类(核心JRE类除外)。因此,您可以做一些事情,例如让每个孩子使用同一罐子的不同版本。


2
投票

这里是how to create an isolated classloader,您随时可以创建一个不受污染的系统类路径,这对于引导Java程序很有用。


1
投票

根据我对与该链接的文章的理解,隔离类加载器是与主系统类加载器分离的类加载器。也就是说,由隔离类加载器加载的类将不适用于JRE中的每个类(仅隔离类加载器加载自身的类[以及任何子类加载器加载的任何类])。


0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.