Spring-0-java.lang.ClassCastException: com.sun.proxy.$Proxy20 cannot be cast to XXX

报错:

java.lang.ClassCastException: com.sun.proxy.$Proxy20 cannot be cast to com.xian.impl.MyMathCalculator
	at com.xian.test.Test2.test(Test2.java:17)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)

当代理对象实现了至少一个接口时, 此代理对象与与本类的联系就是这个接口, 此时应该使用这个类的接口类去获取这个bean.

对于Spring AOP 采用两种代理方法,一种是常规JDK,一种是CGLIB,我的MyMathCalculator实现了一个接口Calculator,当代理对象实现了至少一个接口时,默认使用JDK动态创建代理对象,当代理对象没有实现任何接口时,就会使用CGLIB方法。由于MyMathCalculator实现了Calculator接口,所以强制转换必须用父类Calculator来定义

使用Spring AOP时, 该类实现了一个接口:
@Service("sss")
public class MyMathCalculator implements Calculator {

	public int add(int a, int b) {
		int result = a + b;
		return result;
	}
}

Test:
	@Test
	void test() {
		Calculator mathCalculator = ioc.getBean(Calculator.class);
		//或: Calculator mathCalculator = (Calculator) ioc.getBean("sss");
		int a = mathCalculator.add(2, 12);
		System.out.println(a);
		System.out.println(mathCalculator);
		System.out.println(mathCalculator.getClass());
		System.out.println(mathCalculator.getClass().getSuperclass());
		System.out.println(Arrays.asList(mathCalculator.getClass().getInterfaces()));

	}

在这里插入图片描述可以看出, 代理类和原类的唯一联系就是都实现了com.xian.inter.Calculator接口, 所以需要使用接口类型获取bean.

使用Spring AOP时, 该类未实现接口:
@Service("sss")
public class MyMathCalculator  {

	public int add(int a, int b) {
		int result = a + b;
		return result;
	}
}

Test类:

	ApplicationContext ioc = new ClassPathXmlApplicationContext("applicationContext.xml");
	
	//MyMathCalculator: 没有实现接口
	@Test
	void test2() {
		MyMathCalculator mathCalculator = (MyMathCalculator)ioc.getBean("sss");
		int a = mathCalculator.add(2, 3);
		System.out.println(a);
		System.out.println(mathCalculator);
		System.out.println(mathCalculator.getClass());
		System.out.println(mathCalculator.getClass().getSuperclass());
	}

在这里插入图片描述
可知得到的代理对象是原类的一个子类.

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值