当前位置: 首页 > 面试题库 >

Java 强制转换为同一个类时的ClassCastException

涂羽
2023-03-14
问题内容

我有2个不同的Java项目,其中一个有2个类:dynamicbeans.DynamicBean2和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)。当我尝试将此对象投射回A时,DynamicBean2它失败,并显示ClassCastException

当我使用以下方法将对象拉出会话时

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

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

我为什么要得到这个?


问题答案:

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

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

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

Thread.currentThread().setContextClassLoader(...);

确保该类由层次结构中较高级别的类加载器加载。

序列化和反序列化对象。(Y!)

不过,针对你的特定情况可能有更合适的方法



 类似资料:
  • 问题内容: 我有以下两节课: 和: 当我运行测试时,一切都是笨拙的。如果我将类型参数化更改为: 编译器抱怨,报告: 错误:类型不兼容的整数不能转换为T number = new Integer(11); 其中T是类型变量T扩展了在方法getSomeValue(boolean)中声明的Object 它同样对Double有所抱怨。为什么? 编辑:我犯了一个错误。这实际上是有效的代码。 现在我明白了@S

  • 有一些东西让我困惑,我没有找到关于VM规范的太多信息。这有点晦涩,如果有人能给我解释一下就好了。 这几行代码...... ..... 生成此输出: 浮动:无限 int: 2147483647 短:-1 字节:-1 、和是8位、16位和32位,带有两个补码和是32位和64位的IEEE 754(参见此处)。 根据我的理解,最大值的意味着尾数的所有位(52位)都切换到1。因此,转换为短或字节返回-1,即

  • 强制类型转换 隐式类型转换:隐式类型转换又称为自动类型转换,隐式类型转换可分为三种:算术转换、赋值转换和输出转换。 显式类型转换:显式类型转换又称为强制类型转换,指的是使用强制类型转换运算符,将一个变量或表达式转化成所需的类型,这种类型转换可能会造成数据的精度丢失。 数据有不同的类型,不同类型数据之间进行混合运算时必然涉及到类型的转换问题。 转换的方法有两种: 自动转换(隐式转换):遵循一定的规则

  • 调用AffineTransform: 它驻留在自定义形状类(YingYang)中。 当我进行调用时,当我试图从绘图面板或在类本身(如果我将返回类型更改为YingYang)中将它转换回一个YingYang时,我会得到一个类转换异常。 java.lang.ClassCastException:java.awt.Geom.Path2D$Double不能强制转换为Animation.Yingyang 任何

  • 问题内容: 这可能是在某个地方被问到的,但我找不到。有人可以澄清为什么此代码可以编译并打印出来吗? 问题答案: 它被解析为: 所有和运算符都是一元或的。 在这种情况下,两次取反,因此将其打印为。

  • 应用程序属性 我也试图改变mysql的版本仍然一样。我该怎么解决这个?