我有 2 个不同的 Java 项目,其中一个有 2 个类:dynamicbeans.DynamicBean2
and dynamic.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 Portal Server)。当我尝试将此对象投射回DynamicBean2
它失败并出现 ClassCastException。
当我使用将对象从会话中拉回时
faces.getApplication().createValueBinding("#{DynamicBean2}").getValue(faces);
并使用检查它的类.getClass()
I get dynamicbeans.DynamicBean2
。这是我想要将其转换为的类,但是当我尝试时,我得到了 ClassCastException。
我收到这个有什么原因吗?
我不太明白您对程序流程的描述,但通常当您收到 ClassCastExceptions 时,您无法解释您已使用一个类加载器加载了该类,然后尝试将其转换为另一个类加载器加载的同一类。这是行不通的——它们由 JVM 内的两个不同的 Class 对象表示,并且转换将会失败。
有一个关于 WebSphere 中的类加载的文章 http://www.ibm.com/developerworks/websphere/library/techarticles/0112_deboer/deboer.html。我不能说它如何适用于您的应用程序,但有许多可能的解决方案。我至少能想到:
-
手动更改上下文类加载器。要求您实际上可以获得对适当的类加载器的引用,这在您的情况下可能是不可能的。
Thread.currentThread().setContextClassLoader(...);
确保该类由层次结构中较高的类加载器加载。
序列化和反序列化对象。 (哎呀!)
不过,可能有一种更适合您的具体情况的方法。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)