2

我有一个关于 java ClassLoaders 的问题。我正在尝试使用不同的 ClassLoader 来在同一个程序中运行不同版本的 JAR。

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

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

4

1 回答 1

4

这不是一个简单的主题,我建议在网上做更多的研究,因为这里的答案几乎不够深入。但是,作为一个简短的概要:

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

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

于 2012-11-13T02:44:32.153 回答