Java中的类加载器

Java中的类加载器,java,class,classloader,Java,Class,Classloader,类装入器是分层的。子类装入器要求父类装入该类,如果父类无法装入,则子类通过保持唯一性装入该类。父类加载的所有类都可以被子类加载程序访问,但相反的情况并非如此。我脑海中浮现出这样一个问题:Child要求父级加载该类,但由于某些问题,父级无法加载,所以Child将其加载到JVM中。稍后某个时候,父级需要该类,显然父级无法看到JVM中加载了哪些子类装入器的类,那么父级是否也会在JVM中加载该类呢?同一类的唯一性会发生什么变化?这个问题是如何解决的?任何好的指点都将不胜感激 父级无法加载,因此子级在JV

类装入器是分层的。子类装入器要求父类装入该类,如果父类无法装入,则子类通过保持唯一性装入该类。父类加载的所有类都可以被子类加载程序访问,但相反的情况并非如此。我脑海中浮现出这样一个问题:Child要求父级加载该类,但由于某些问题,父级无法加载,所以Child将其加载到JVM中。稍后某个时候,父级需要该类,显然父级无法看到JVM中加载了哪些子类装入器的类,那么父级是否也会在JVM中加载该类呢?同一类的唯一性会发生什么变化?这个问题是如何解决的?任何好的指点都将不胜感激

父级无法加载,因此子级在JVM中加载它

父级可能无法加载该类,原因有两个:物理上找不到该类,或者该类预期会出现暂时故障。在前一种情况下,
ClassLoader
将抛出一个
ClassNotFoundException
,这永远不会改变。在后者中,将从父类抛出不同的异常,从而中断子类装入器。所以这种情况永远不应该发生

同一类的唯一性会发生什么变化


在这种情况下不是这样,但从技术上讲这是可能的,特别是在具有复杂类装入器层次结构的应用程序服务器中。本质上,两个类加载器可以加载同一个不兼容的类(您可以得到
ClassCastException
)。

在您的情况下,JVM中会有两个名称相同但实例不同的类。这些类别在各个方面都被认为是不同的。当您尝试分配引用“跨类加载器”时,您将得到类似

Cannot cast class Foo to class Foo

这不是一个理论问题-这种异常在Java EE/EJB域中时不时会出现。

在以下所有情况下,相等的类必须相等: 1.类的名称应相同 2.包的名称应相同 3.加载类的类加载器必须相同

因此,没有被同一个类加载器加载的类不是同一个类! 通过这种方式,您可以在同一应用服务器中导入两个不同版本的JAR,这是由不同的类加载器完成的

希望对你有帮助