【问题标题】:ClassLoaders in JavaJava 中的类加载器
【发布时间】:2012-08-26 16:44:53
【问题描述】:
类加载器是分层的。子类加载器要求父类加载类,如果父类不能加载类,则子类加载,从而保持唯一性。父类加载的所有类都可以被子类加载器访问,但反之则不然。我的脑海中出现了一个问题: Child 要求 parent 加载类,但由于某些问题,parent 无法加载,所以 child 将其加载到 JVM 中。在某些时候,父级需要该类,显然父级无法看到 JVM 中加载了哪些子类加载器的类,那么父级是否也会在 JVM 中加载该类?同一个类的唯一性怎么办?问题如何解决?任何好的指针将不胜感激。
【问题讨论】:
标签:
java
class
classloader
【解决方案1】:
parent 无法加载,所以 child 在 JVM 中加载它
由于两个原因,父类可能无法加载该类:物理上找不到类或它预计会出现一些暂时性故障。在前一种情况下,ClassLoader 将抛出一个 ClassNotFoundException 并且永远不会改变。在后者中,父类会抛出一个不同的异常,从而中断子类加载器。所以这种情况绝不应该发生。
同一个类的唯一性怎么办?
在这种情况下不是这样,但在技术上这是可能的,尤其是在具有复杂类加载器层次结构的应用程序服务器中。本质上两个类加载器可以加载同一个类,它们是不兼容的(你可以得到ClassCastException)。
【解决方案2】:
在您的情况下,JVM 中将有两个具有相同名称但不同 Class 实例的类。这些类在各个方面都被认为是不同的。当您尝试分配引用“跨类加载器”时,您将获得类似
Cannot cast class Foo to class Foo
这不是理论上的问题——这种异常在 Java EE/EJB 域中时不时出现。
【解决方案3】:
相等的类必须在以下所有情况下都相等:
1.类名要一致
2.包名要一致
3.加载类的classLoader必须相同。
所以不是同一个classLoader加载的类不是同一个类!
这样你就可以在同一个应用服务器中导入两个不同版本的jar,这是由不同的classLoader完成的。
希望对你有帮助……