com.sun.proxy.$Proxy4 cannot be cast to spring.HelloService

用spring获取bean的时候遇到代理对象不能转化为本类对象的问题

HelloService hello = (HelloService) application.getBean("helloService");

这个是 HelloService 实现 IhelloService接口

public class HelloService implements IhelloService{
    @Override
    public void sayHello(){
        System.out.println("Hello Spring!!!");
    }
}

HelloService创建代理

public class MyBeanPostProcessor implements BeanPostProcessor{

    @Override
    public Object postProcessAfterInitialization(final Object bean, String beanName)
            throws BeansException {

        if("helloService".equals(beanName)){
            Object proxy= Proxy.newProxyInstance(bean.getClass().getClassLoader(), bean.getClass().getInterfaces(),new InvocationHandler() {
                @Override
                public Object invoke(Object proxy, Method method, Object[] args)
                        throws Throwable {

                        if(method.getName().equals("sayHello")){
                            System.out.println("在sayHhello之前啊啊!!!");
                            Object res = method.invoke(bean, args);
                            return res;
                        }

                    return method.invoke(bean, args);
                }
            });

            return proxy;
        }
        return bean;
}

解决办法:将返回的代理对象强转成代理类的接口才行!

IhelloService hello = (IhlloService) application.getBean("helloService");

原因:
在使用代理时,目标对象和代理对象都会实现共同的接口,但是也可以在各自的实际类中添加自己的方法和属性,所以返回的代理对象只能由他们共同的接口引用,而不能使用实现了共同接口的目标对象的类来引用。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值