类投射到同一类时的异常

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

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

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

然后,我继续使用并存储它来创建一个对象,然后我也使用并将其添加到会话中创建一个bean对象。ValidatorvalidatorClass.newInstance()validatorbeanClass.newInstance()

portletRequest.setAttribute("DynamicBean2", bean);

在项目的生命周期中,我调用从会话加载先前创建的Bean对象(我正在运行Websphere Portal Server)。当我尝试将此对象转换回某个对象时,ClassCastException 会失败。Formvalidator.validate()DynamicBean2

当我使用将对象拉出会话时

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

并使用我得到检查它的类。这是我想把它扔到的类,但是当我尝试时,我会得到ClassCastException。.getClass()dynamicbeans.DynamicBean2

我得到这个有什么原因吗?


答案 1

我不太遵循你对程序流的描述,但通常当你得到ClassCastExceptions时,你不能解释你已经用一个类加载器加载了类,然后尝试将其转换为另一个类加载器加载的同一类。这是行不通的 - 它们由JVM内两个不同的Class对象表示,强制转换将失败。

有一篇关于 WebSphere 中的类装入的文章。我不能说它如何适用于您的应用程序,但是有许多可能的解决方案。我至少可以想到:

  1. 手动更改上下文类装入器。要求您实际可以获得对适当类装入器的引用,这在您的情况下可能是不可能的。

    Thread.currentThread().setContextClassLoader(...);
    
  2. 确保该类由层次结构中较高位置的类装入器装入。

  3. 序列化和反序列化对象。(哎呀!

不过,对于您的特定情况,可能有一种更合适的方法。


答案 2

在我的Springboot项目中添加依赖项后,我遇到了这个问题。我删除了依赖项,问题消失了。在这一点上,我最好的猜测是,它带来了一个新的类装入器,并且在某些情况下,在某些线程未使用新的类装入器的情况下,这会导致不同类装入器之间的类转换问题。spring-boot-devtoolsspring-boot-devtools

参考:与 Spring Boot 开发工具相关的推土机地图异常