目前jdk动态代理的底层实现是jdk先动态生成一个class文件,生成的class文件大概长这样:
//代理Hello接口时jdk生成的源码
public final class $Proxy0 extends Proxy implements Hello {
...
}
于是从jdk生成的class文件中,我们可以看出这个类已经继承了Proxy类,由于java类的单继承特性,故不支持代理类。也就是说假设支持类的动态代理,则按照jdk生成class的套路,将生成下面的代码,很明显是不能通过编译的(违反单继承特性)
//代理Hello类时jdk生成的源码(违反单继承特性)
public final class $Proxy0 extends Proxy , Hello {
...
}
- spring的cglig支持类的动态代理
cglib是一个java字节码的生成工具,它动态生成一个被代理类的子类,子类重写被代理的类的所有不是final的方法。在子类中采用方法拦截的技术拦截所有父类方法的调用,顺势织入横切逻辑
参考:CGLIB动态代理机制
注意:本文归作者所有,未经作者允许,不得转载