2

类加载器是分层的。子类加载器要求父类加载类,如果父类不能加载类,则子类加载,从而保持唯一性。父类加载的所有类都可以被子类加载器访问,但反之则不然。我的脑海中出现了一个问题:child 要求 parent 加载类,但由于某些问题,parent 无法加载,所以 child 将其加载到 JVM 中。在某些时候,父级需要该类,并且显然父级无法看到 JVM 中加载了哪些子类加载器的类,那么父级是否也会在 JVM 中加载该类?同一个类的唯一性怎么办?问题如何解决?任何好的指针将不胜感激。

4

3 回答 3

2

父级无法加载,因此子级将其加载到 JVM 中

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

同一个类的唯一性怎么办?

不是在这种情况下,但在技术上这是可能的,尤其是在具有复杂类加载器层次结构的应用程序服务器中。本质上两个类加载器可以加载同一个类,它们是不兼容的(你可以得到ClassCastException)。

于 2012-08-26T16:53:42.320 回答
0

相等的类必须在以下所有方面都相等: 1. 类的名称应该相同 2. 包的名称应该相同 3. 加载该类的 classLoader 必须相同。

所以不是同一个classLoader加载的类不是同一个类!这样你就可以在同一个应用服务器中导入两个不同版本的 jar,这是由不同的类加载器完成的。

希望能帮助到你...

于 2013-02-14T12:21:20.300 回答
0

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

Cannot cast class Foo to class Foo

这不是理论上的问题——这种异常在 Java EE/EJB 域中时不时出现。

于 2012-08-26T16:55:37.950 回答