gpt4 book ai didi

java - 转换为同一类时出现 ClassCastException

转载 作者:IT老高 更新时间:2023-10-28 20:30:20 29 4
gpt4 key购买 nike

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

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

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

然后我继续使用 validatorClass.newInstance() 创建一个 Validator 对象并将其存储在 validator 然后我创建一个 bean 对象以及使用 beanClass.newInstance() 并将其添加到 session 中。

portletRequest.setAttribute("DynamicBean2", bean);

Form 项目的生命周期中,我调用 validator.validate() 从 session 加载先前创建的 bean 对象(我正在运行 Websphere Portal Server )。当我尝试将此对象强制转换回 DynamicBean2 时,它会因 ClassCastException 而失败。

当我将对象拉出 session 时使用

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

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

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

最佳答案

我并没有完全按照您对程序流程的描述,但是通常当您收到 ClassCastExceptions 时,您无法解释您已经使用一个类加载器加载了该类,然后尝试将其强制转换为由另一个类加载器加载的同一个类。这不起作用 - 它们由 JVM 内的两个不同的 Class 对象表示,并且转换将失败。

有一个 article about classloading in WebSphere .我不能说它如何应用于您的应用程序,但有许多可能的解决方案。我至少能想到:

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

    Thread.currentThread().setContextClassLoader(...);
  2. 确保类是由层次结构中更高的类加载器加载的。

  3. 序列化和反序列化对象。 (糟糕!)

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

关于java - 转换为同一类时出现 ClassCastException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/826319/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com