gpt4 book ai didi

java - ClassCastException : com. sun.proxy.$ProxyX 无法转换为类

转载 作者:行者123 更新时间:2023-12-05 06:29:55 24 4
gpt4 key购买 nike

我有一个 Spring bean(ChildBean extends Parent),它正在扩展一个抽象类(Parent implements Runnable)。

public abstract class Parent implements Runnable {
public final void run() {
// some code
}

public int overridenFunct() {
// some code
}
}

导致 ClassCastException 的子 bean 类变体:

@Transactional
@Scope("prototype")
@Service("beanName")
public class ChildBean extends Parent {
@Override
public int overridenFunct() {
// some diff code
}
}

一切正常,直到我在子 bean 中覆盖父类的公共(public)非抽象方法。之后,当我尝试创建该 bean 的实例时抛出 ClassCastException。

Parent p = (Parent) appContext.getBean("beanName");

getBean() 返回的 Bean 对象是一个 ChildBean 类实例(已通过调试器检查)。为什么将 ChildBean 对象转换为其抽象父类 Parent 不起作用?因此,如果没有在 ChildBean 中实现的 overridenFunct() 一切正常。有人能告诉我这里有什么问题吗?

更新:

将方法 overridingFunct() 更改为 protected 可解决此问题。但是如果我需要重写一个公共(public)方法怎么办?这是允许的吗?我正在使用 Spring 3.2.8

更新 2:

嗯,我没明白为什么重写抽象父类中的公共(public)方法会导致 ClassCastException。作为解决方案,我执行了以下操作:创建了一个接口(interface),其中包含所有具有公共(public)逻辑的公共(public)方法,一个抽象类,它实现了该接口(interface)和所有“公共(public)”方法。然后所有子 bean 都从该抽象类扩展,实现其特定逻辑。

最佳答案

对于可能遇到此错误的任何人,以下内容可能对调试此错误很有用。首先,问题可能是由于依赖过度包含导致类加载器加载特定类的两个副本引起的。

通过 IDE 或通过

向您的 JVM 提供以下选项
java -verbose:class {rest of your args / options}

然后,监视特定父类的控制台输出。该类有可能两次进入 ClassLoader,可能是通过多次包含特定的依赖项。请特别注意从查找中检索到 bean 的时间。

我在 2022 年 4 月 22 日解决了一个问题,方法是使用上述策略来追踪我们的 Gradle 构建脚本中导致额外文件进入 WAR 的问题。

关于java - ClassCastException : com. sun.proxy.$ProxyX 无法转换为类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52932135/

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