首页 > java > spring jdk代理的坑

spring jdk代理的坑

作者:bin

JDK代理是基于接口形式进行代理的,那么生成的代理类在使用的时候,就可以用接口形式去使用。

但是如果存在多层继承与实现的话,JDK代理在使用时就可能出现问题。

例如A接口,被B抽象类实现,然后又被Q继承:

public interface A {
    void run();
}
public abstract class B implements A {
    public abstract int getRunTime();
}
 public class Q extends B {

    @Override
    public int getRunTime(){
        return 1;
    }

    @Override
    public void run(){
        log.info("this.getRunTime();" + this.getRunTime());
        log.info("执行完成");
    }
}

然后我们根据B类型进行注入使用时,如果将对象转换为B,那就会报错,因为注入的代理对象时实现A接口的,并没有继承自B类

public class Controller {
    @Autowired
    Map<String, B> BList;

    @GetMapping("/test")
    public void test(){
        log.info("ttt");
        try {
            B b = (B) BList.get("q");
            b.run();
        }catch ( Exception e){
            log.error("",e);
        }

    }
}

执行上面的test方法会跑出异常

java.lang.ClassCastException: com.sun.proxy.$Proxy61 cannot be cast to com.errorTest.B

配上图理解更容易

您必须 [ 登录 ] 才能发表留言!