【问题标题】: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完成的。

        希望对你有帮助……

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-12-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-04-16
          • 1970-01-01
          • 2010-10-07
          相关资源
          最近更新 更多