【问题标题】:Getting class cast exception where both classes are exactly the same获取两个类完全相同的类转换异常
【发布时间】:2017-08-16 20:42:29
【问题描述】:

我正在做一个 JBoss SEAM 项目,当我查看表单时出现此错误。

java.lang.ClassCastException:
it.cogitoweb.csi.entity.csiorelav.CsiTipoLav cannot be cast to
it.cogitoweb.csi.entity.csiorelav.CsiTipoLav

它总是与屏幕上显示的表单相关的同一个 JPA 类,我不明白为什么它是同一个类,这似乎是不可能的。

【问题讨论】:

    标签: java classcastexception


    【解决方案1】:

    当两个不同的ClassLoader 对象加载同名的类时会发生这种情况。 Java 中两个类的相等性取决于完全限定名称加载它的类加载器。

    因此,如果两个独立的类加载器从同一位置加载类,那么这些类型的对象将无法转换为彼此的类型,即使它们的类被称为相同。

    【讨论】:

    • 我遇到了类似的问题。有没有办法解决这个问题?
    • @Joachim Sauder:如何解决这个问题,有什么办法可以解决吗?
    • @msangel: 只有当你能确保 interface 只由单个类加载器加载时才有帮助,如果你能管理它,你通常也可以很容易确保对象也使用相同的类加载器加载。
    • 解决办法是什么!?
    • @Joachim Sauer 你能以java大师的身份提供解决方案吗?
    【解决方案2】:

    正如 Joachim 之前解释的,java.lang.ClassCastException 通常发生在两个类加载器加载同名的类时。但是,我遇到了另一种可能发生这种情况的情况。

    这可能发生在某些 IDE 会自动重新加载已修改的类。在这种情况下,可能有旧版本的类保留在内存中导致 ClassCastException。

    您可以通过以下几种方式解决此问题:

    1. 如果您正在编写自定义类加载器,在加载类时请确保基本/默认类加载器尚未加载该类的实例。

    2. 使正在加载的类成为默认类加载器已加载的类的子类。

    3. 使正在加载的类实现一个已被默认类加载器加载的接口。

    更多信息在这里 - http://www.jspwiki.org/wiki/A2AClassCastException

    【讨论】:

    • 是的,那是血腥的 IDE X(。非常感谢日食几乎夺走了我的生命。(生产日)
    【解决方案3】:

    这是因为该类已被两个不同的类加载器加载。你不能在它们之间施放。

    您的应用程序中可能有CsiTipoLav 的重复副本,并且这两个不同的副本是在不同的时间从不同的类加载器加载的。 JBoss 在层次结构中有大量不同的类加载器,很容易搞定。

    确保您只有一份课程副本。

    【讨论】:

      【解决方案4】:

      您尝试转换的对象由不同的类加载器加载,而不是加载了您尝试转换的类。

      【讨论】:

        【解决方案5】:

        在我的情况下,我有两个不同的 *.ear 并且想从另一个加载一个类。 所以我不得不隔离类加载器。我用了这个描述:

        http://www.thorgull.be/wiki/index.php?title=ClassLoader_isolation_in_JBOSS

        它对我有用。

        【讨论】:

        • 我也遇到过同样的问题。提供的网址现在似乎不可用。无论如何,您能否解释一下或让我知道任何步骤...对我有很大帮助...
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-04-13
        • 1970-01-01
        • 1970-01-01
        • 2013-12-07
        • 1970-01-01
        • 2018-05-24
        • 1970-01-01
        相关资源
        最近更新 更多