gpt4 book ai didi

Java 类加载器委托(delegate)

转载 作者:行者123 更新时间:2023-11-30 07:21:29 24 4
gpt4 key购买 nike

我有一个关于 java 类加载器的问题。我正在尝试使用不同的 ClassLoader 以便能够从同一程序中运行不同版本的 JAR。

我在某处听说,如果您使用一个类加载器加载一个类,则从该类中调用(加载)的所有类都将使用相同的类加载器。这是正确的吗?

如果没有,是否有一种巧妙的方法来设置 ClassLoader 的上下文(比方说,从特定类/库调用的所有内容都应该使用相同的 ClassLoader)。

最佳答案

这不是一个简单的主题,我建议您在线进行更多研究,因为这里没有足够深入的答案。但是,作为一个简短的概要:

  • 通过普通类引用加载的类(即 A 类中使用静态类型 B 变量的一行代码)将使用与初始类相同的类加载器加载。
  • 但是,由于类加载器委派,一个类实际上可能由最初开始搜索的类加载器加载。例如,我有一个由类加载器 LA 和父类加载器 LP 加载的 A 类。 B 类被 A 引用,所以查找 B 类将从 LA 开始。但是,B 的类字节实际上在 LP 中找到,因此 LP 加载类并将其交给 LA,LA 返回它。然而,B 最终归 LP 所有, LA。
  • 对于通过反射加载类的实用程序(例如序列化、JAXB、Hibernate 等)或通常与嵌套类加载器一起使用的框架(例如 Java EE 应用程序服务器),所有的赌注都没有了。 通常这样的实用程序/框架使用 context classloader 加载类,但情况并非总是如此。关于使用哪个类加载器,每个实用程序可能有不同的优先级和回退。此外,许多方法都有在运行时显式提供类加载器的方法。

根据经验,在执行您知道来自嵌套类加载器的代码时(可能是因为您设置了它),您应该适本地设置当前上下文类加载器。

关于Java 类加载器委托(delegate),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13354640/

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