spring框架中动态代理类异常:java.lang.ClassCastException: com.sun.proxy.$Proxy13 cannot be cast to xxx

本文介绍了Spring框架中遇到ClassCastException的原因,即在获取bean时返回的是接口而非具体实现。通过面向接口编程和依赖注入,Spring隐藏了具体类的细节,解决办法是正确地以接口类型获取bean。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

java.lang.ClassCastException: com.sun.proxy.$Proxy13 cannot be cast to xxx这个异常的出现一般是在Spring框架在获取bean时出现的问题。

Spring框架在获取bean时通常返回的是接口类型,而不是接口的具体实现类,这是因为Spring框架通常使用依赖注入和面向接口编程的方式来实现松耦合和可替换性。这种设计使得应用程序更容易进行单元测试、模块替换和扩展。

通过返回接口类型,Spring框架可以隐藏具体实现类的细节,从而使得应用程序更加灵活和可维护。同时,这也促进了依赖注入和AOP(面向切面编程)等技术的应用,使得应用程序的结构更加清晰和易于管理。

所以解决这个问题就是在获取bean时返回该类的接口类型。

下面给一个实例:

接口:

public interface Calculator {

    int add(int i, int j);

    int sub(int i, int j);

    int mul(int i, int j);

    int div(int i, int j)
}

实现类:


import org.springframework.stereotype.Component;

@Component("calculatorPureImpl")
public class CalculatorPureImpl implements Calculator {

    public int add(int i, int j) {

        int result = i + j;
        System.out.println("方法内部 result = " + result);
        return result;
    }

    public int sub(int i, int j) {

        int result = i - j;
        System.out.println("方法内部 result = " + result);
        return result;
    }

    public int mul(int i, int j) {

        int result = i * j;
        System.out.println("方法内部 result = " + result);


        return result;
    }

    public int div(int i, int j) {
        int result = i / j;
        System.out.println("方法内部 result = " + result);
        return result;
    }
}

测试类1:

@Test
public void addTest(){
    ApplicationContext ac = new ClassPathXmlApplicationContext("spring.xml");
    CalculatorPureImpl cp = (CalculatorPureImpl) ac.getBean("calculatorPureImpl");
    int i = cp.add(10, 20);
    System.out.println("i = " + i);
}

第一个测试获取的bean是实现类,运行时就会出现ClassCastException问题

测试类2:

@Test
public void addTest(){
    ApplicationContext ac = new ClassPathXmlApplicationContext("spring.xml");
    Calculator cp = (Calculator) ac.getBean("calculatorPureImpl");
    int i = cp.add(10, 20);
    System.out.println("i = " + i);
}

解决方案:将类型转换为对应的接口类,或

Calculator cp = ac.getBean(Calculator.class);直接获取接口类型

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值