【问题标题】:Java classloader delegationJava 类加载器委托
【发布时间】:2012-11-01 12:31:12
【问题描述】:

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

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

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

【问题讨论】:

    标签: java jar classloader


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-10-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多