我有2个不同的Java项目,其中一个有2个类:dynamicbeans.DynamicBean2和dynamic.Validator。
dynamicbeans.DynamicBean2和dynamic.Validator
在另一个项目中,我动态加载这两个类并将它们存储在 Object
class Form { Class beanClass; Class validatorClass; Validator validator; }
然后,我继续Validator使用创建一个对象validatorClass.newInstance()并将其存储在该对象上,validator然后我还将创建一个bean对象beanClass.newInstance()并将其添加到会话中。
Validator
validatorClass.newInstance()
validator
bean
beanClass.newInstance()
portletRequest.setAttribute("DynamicBean2", bean);
在Form项目的生命周期中,我调用validator.validate()从会话中加载先前创建的bean对象(我正在运行Websphere Portal Server)。当我尝试将此对象投射回A时,DynamicBean2它失败,并显示ClassCastException。
validator.validate()
Websphere Portal Server
DynamicBean2
ClassCastException
当我使用以下方法将对象拉出会话时
faces.getApplication().createValueBinding("#{DynamicBean2}").getValue(faces);
并使用.getClass()I get 检查它的类dynamicbeans.DynamicBean2。这是我想强制转换为的类,但是当我尝试得到ClassCastException时。
.getClass()I get
dynamicbeans.DynamicBean2
我为什么要得到这个?
我不太了解你对程序流程的描述,但是通常当你收到ClassCastExceptions时,你无法解释已经用一个类加载器加载了该类,然后尝试将其转换为另一个类加载器加载的同一个类。这将不起作用-它们由JVM中的两个不同的Class对象表示,并且转换将失败。
有一篇关于WebSphere中的类加载的文章。我不能说它如何适用于你的应用程序,但是有许多可能的解决方案。我至少可以想到:
手动更改上下文类加载器。要求你实际上可以获取对适当的类加载器的引用,这在你的情况下是不可能的。
Thread.currentThread().setContextClassLoader(...);
确保该类由层次结构中较高级别的类加载器加载。
序列化和反序列化对象。(Y!)
不过,针对你的特定情况可能有更合适的方法