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);直接获取接口类型