class 加载器的委托模型如何确保加载唯一的 classes?

How does the delegation model of class loaders ensure that unique classes are loaded?

我一直在阅读 Java 中 class 加载程序的委派模型的 'uniqueness' 功能:

https://www.baeldung.com/java-classloaders#uniqueness

我不明白,如果没有这样的模型,我们怎么会 运行 有加载非唯一 classes 的风险?

当 class 加载器使用完全限定的 class 名称来加载它们时,我们怎么会最终加载重复的 classes,特别是当我们检查 class 在将任务委派给父加载器之前是否已加载?

https://www.baeldung.com/java-classloaders#classloader-work

假设我们有 2 个 jar 文件,每个包含 class com.example.Foo.

假设 jar 文件由 2 个不同的 classloader 加载,其中 loader1 是 loader2 的父级。

无论我们是 运行 loader1 还是使用 loader2 作为活动 classloader,我们总是从 loader1 获得 class。第二个 jar 文件中的 class 永远不会被加载,因此唯一性得到保证,即我们不会在内存中有 2 个同名的 class。


仅供参考: Servlet 规范违反了委托模型,如果它是活动的 classloader,将从 loader2 加载 class。众所周知,这会造成麻烦,尤其是对于旧的 Apache Commons Logging 库(版本 1)。

how can we end up loading duplicate classes, specially when we check whether or not a class has been loaded before delegating the task to parent loader? https://www.baeldung.com/java-classloaders#classloader-work

class加载程序检查class是否已加载的步骤,即method java.lang.ClassLoader.findLoadedClass,并不意味着唯一性。想象两个 class 加载器,CL1CL2,都加载一个 class X。在这种情况下,如果 CL1CL2 之前加载 X,则 CL2 完成的检查将 而不是 return相同的 class 由 CL1 加载,因为这些 class 加载程序不在它们之间共享此信息。

委托模型是通过父 class 加载程序“共享”此信息的模型。