Java类加载器委派

时间:2012-11-13 02:03:20

标签: java jar classloader

我对java ClassLoaders有疑问。我正在尝试使用不同的ClassLoaders,以便能够在同一程序中运行不同版本的JAR。

我听说过如果你使用一个ClassLoader加载一个类,那么从该类中调用(被加载)的所有类都将使用相同的ClassLoader。这是对的吗?

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

1 个答案:

答案 0 :(得分:4)

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

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

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