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");

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

展开阅读全文

没有更多推荐了,返回首页