猿问

当转换到同一个类时引发ClassCastException。

当转换到同一个类时引发ClassCastException。

我有两个不同的Java项目,一个有两个类:dynamicbeans.DynamicBean2dynamic.Validator.

在另一个项目中,我动态地加载这两个类,并将它们存储在Object

class Form {
    Class beanClass;
    Class validatorClass;
    Validator validator;}

然后继续创建一个Validator对象使用validatorClass.newInstance()然后放在上面validator然后,我还创建了一个bean对象,并使用beanClass.newInstance()并将其添加到会话中。

portletRequest.setAttribute("DynamicBean2", bean);

的生命周期中,Form项目,我打电话给validator.validate()它从会话加载先前创建的bean对象(我正在运行Websphere PortalServer)。当我试图将这个对象转换回DynamicBean2它在ClassCastException中失败。

当我将对象从会话中拉回来时,使用

faces.getApplication().createValueBinding("#{DynamicBean2}").getValue(faces);

并使用.getClass()我得到dynamicbeans.DynamicBean2..这是我想要将其转换到的类,但是,当我尝试时,我会得到ClassCastException。

我为什么要拿到这个?


慕村9548890
浏览 1073回答 3
3回答

哈士奇WWW

我并不完全遵循您对程序流的描述,但通常当您得到ClassCastExceptions时,您无法解释您已经用一个类加载器加载了该类,然后尝试将其转换为由另一个类加载器加载的同一个类。这是行不通的-它们由JVM中的两个不同的Class对象表示,而强制转换将失败。有一个关于WebSphere中的类加载的文章..我不能说它如何应用于您的应用程序,但有许多可能的解决方案。我至少能想到:手动更改上下文类加载器。要求您实际上可以获得对适当的类加载器的引用,在您的情况下这可能是不可能的。Thread.currentThread().setContextClassLoader(...);确保类是由层次结构中较高的类加载器加载的。序列化和反序列化对象。(恶心!)不过,对于你的特殊情况,可能有一种更合适的方法。

慕的地8271018

类对象是在不同的类加载器中加载的,因此在每个类中创建的实例被视为“不兼容”。这是一个常见的问题,在一个环境中,有许多不同的类加载器正在被使用,并且对象正在被传递。这些问题很容易在JavaEE和门户环境中出现。强制转换类的实例需要链接到被抛出的对象的类与当前线程上下文类加载器加载的类相同。

料青山看我应如是

当我试图使用ApacheCommonsDigester从XML创建对象列表时,遇到了A2AClassCastException问题。List<MyTemplate>&nbsp;templates&nbsp;=&nbsp;new&nbsp;ArrayList<MyTemplate>();Digester&nbsp;digester&nbsp;=&nbsp;new&nbsp;Digester();digester.addObjectCreate("/path/to/template",&nbsp;MyTemplate.class);digester.addSetNext("/path/to/template",&nbsp;"add");//&nbsp;Set&nbsp;more&nbsp;rules...digester.parse(f);&nbsp;//&nbsp;f&nbsp;is&nbsp;a&nbsp;pre-defined&nbsp;Filefor(MyTemplate&nbsp;t&nbsp;:&nbsp;templates)&nbsp;{&nbsp;//&nbsp;ClassCastException:&nbsp;Cannot&nbsp;cast&nbsp;mypackage.MyTemplate&nbsp;to&nbsp;mypackage.MyTemplate &nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Do&nbsp;stuff}如前所述,原因是消化器没有使用与程序其余部分相同的ClassLoader。我在JBoss中运行了这个程序,结果发现Commons-digester.jar不是在JBosslib目录中,而是在一个webapp的lib目录中。将JAR复制到mywebapp/Web-INF/lib中也解决了这个问题。另一个解决方案是Case digester.setClassLoader(MyTemplate.class.getClassLoader()),但在这种情况下,这是一个非常难看的解决方案。
随时随地看视频慕课网APP

相关分类

Java
我要回答