gpt4 book ai didi

java - 如何使用两个具有相同全名的不兼容类?

转载 作者:搜寻专家 更新时间:2023-10-31 20:30:41 24 4
gpt4 key购买 nike

一个问题:我的应用程序使用了两个库,这两个库使用了第三个库的不兼容版本。有人知道类隔离的任何方法吗?

我听说过类加载器,但我不明白,它们如何提供帮助 - 如果我们将加载一个版本的类,我们无法加载另一个 - 类已经加载?

我也在考虑 Spring,但不知道它是否提供这种隔离。

最佳答案

ClassLoaders 基本上是为 JVM 中的类赋予意义的元素。它们形成一个层次结构,根位于 JVM 中并加载 Java 类。 ApplicationClassLoader 是您必须考虑的第一个类加载器,因为它加载应用程序的所有类。

当加载一个类时,它对其他类的所有引用都将被解析并加载这些类。默认情况下,JVM 提供了一个系统,在该系统中,类加载器首先询问它们的父类,看看它们是否已经加载了一个类。如果没有,他们会在类路径中搜索

如果两个类位于两个不同的类加载器中,而不是在应用程序类加载器中,则它们可以被隔离。这并不难做到。您只需创建一个类加载器(如 URLClassLoader),同时指定其父类及其类路径(字节码所在的位置)

然后,你告诉他加载一个类。它会询问它的父类,如果这个类还没有加载,它会搜索它的类路径并加载它。如果您创建另一个附加到同一个父类的类加载器,则第一个加载的类将永远不会被第二个看到,因为它们是兄弟。而第二个可以毫无问题地加载一个同名的类

这是一个很好的隔离

应用服务器使用另一种形式的委托(delegate)在应用程序之间进行坦率的隔离。他们重新定义了一个类加载器扩展,例如,URLClassLoader 并通过首先开始在他们的类路径中搜索类来反转委托(delegate)过程,然后向父级请求

关于java - 如何使用两个具有相同全名的不兼容类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6072999/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com