25

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

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

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

4

5 回答 5

40

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

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

于 2010-03-03T14:22:28.573 回答
8

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

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

以下是您可以解决此问题的几种方法:

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

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

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

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

于 2011-09-27T10:24:56.307 回答
5

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

您的应用程序中可能有一个副本CsiTipoLav,并且这两个不同的副本是在不同的时间从不同的类加载器加载的。JBoss 在层次结构中有大量不同的类加载器,很容易让事情变得扭曲。

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

于 2010-03-03T14:22:22.450 回答
2

就我而言,我有两个不同的 *.ear 并想从另一个加载一个类。所以我不得不隔离类加载器。我使用了这个描述:

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

它对我有用。

于 2013-08-30T09:07:34.193 回答
2

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

于 2010-03-03T14:22:22.940 回答