Java类加载器委派

Java类加载器委派,java,jar,classloader,Java,Jar,Classloader,我有一个关于java类加载器的问题。我正在尝试使用不同的类加载器,以便能够在同一个程序中运行不同版本的JAR 我听说,如果您使用一个类加载器加载一个类,那么从该类中调用(正在加载)的所有类都将使用相同的类加载器。这是正确的吗 如果没有,是否有一种简洁的方法来设置类加载器的上下文(比如说,从特定类/库调用的所有内容都应该使用相同的类加载器)。这不是一个简单的主题,我建议在网上做更多的研究,因为这里没有足够深入的答案。但是,作为一个简短的概要: 通过普通类引用加载的类(即类a中使用静态类型B变量的

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

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


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

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

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

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

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

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