JDK动态代理为什么只能代理有接口的类

1. 为什么只能代理有接口的类?

是因为JDK动态代理本身机制决定的,首先在java里面动态代理是Proxy.newProxyInstance()这个方法来实现的,它需要传入被动态代理的一个接口类,还是取决于JDK动态代理的的一个底层实现,JDK动态代理会在程序运行期间,去动态生产一个代理类,叫$ProxyO,那么这个动态生成的代理类会去继承一个java.lang.reflect.Proxy这样一个类,同时还会去实现被代理类的接口,在java里面不支持多种继承的,而每个动态代理都继承一个Proxy,所以就导致的JDK里面的动态代理只能代理接口,而不能代理实现类

2. JDK动态代理可以代理类吗

3. 可以这么设计

1.动态代理本身的使用场景或者需求,只是对原始实现一个拦截,然后去做一些功能的增强或者扩展,展而实际的开发模式,都是基于面向接口来开发的,所以基于接口来实现动态代理,从需求和场景都是吻合的,当然确实会存在一些没有实现接口的一些类,那么这个我们要去实现动态代理,那么jdk就显然无法满足的

2.在java里面,类的技能关系的设计,更多的是考虑到共性能力的抽象,从而提高代码的重用性和扩展性,而动态代理其实也在做这样的事情,它封装了动态代理的生成和抽象逻辑,以及判断一个类是否是动态代理类,以及InvocationHandler的一个持有等等,那么我们这个抽象逻辑放在Proxy这个父类里面,很显然也是一个比较正常的一个思路

4. 还可以怎么实现

我们可以选择cglib动态代理,它会动态生成一个,被代理类的子类,子类重写父类非final修饰的方法,在子类中拦截父类的所有方法的一个调用从而去实现动态代理

经验分享 程序员 微信小程序 职场和发展