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

原因:
在使用代理時,目標對象和代理對象都會實現共同的接口,但是也可以在各自的實際類中添加自己的方法和屬性,所以返回的代理對象只能由他們共同的接口引用,而不能使用實現了共同接口的目標對象的類來引用。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章