为什么只能代理有接口的类?
是因为JDK动态代理本身机制决定的,首先在java里面动态代理是
Proxy.newProxyInstance()
这个方法来实现的,它需要传入被动态代理的一个接口类,还是取决于JDK动态代理的的一个底层实现,JDK动态代理会在程序运行期间,去动态生产一个代理类,叫$ProxyO
,那么这个动态生成的代理类会去继承一个 java.lang.reflect.Proxy
这样一个类,同时还会去实现被代理类的接口,在java里面不支持多种继承的,而每个动态代理都继承一个Proxy,所以就导致的JDK里面的动态代理只能代理接口,而不能代理实现类
JDK动态代理可以代理类吗
Proxy这个类只是保存了动态代理的一个处理器叫InvocationHandler
如果不抽出来,直接设置在$ProxyO
这个动态代理的里面我认为也是可以的,如果这么去实现的话,就可以针对类做动态的代理了,作者为什么这么设计
可以这么设计
1.动态代理本身的使用场景或者需求,只是对原始实现一个拦截,然后去做一些功能的增强或者扩展,展而实际的开发模式,都是基于面向接口来开发的,所以基于接口来实现动态代理,从需求和场景都是吻合的,当然确实会存在一些没有实现接口的一些类,那么这个我们要去实现动态代理,那么jdk就显然无法满足的
2.在java里面,类的技能关系的设计,更多的是考虑到共性能力的抽象,从而提高代码的重用性和扩展性,而动态代理其实也在做这样的事情,它封装了动态代理的生成和抽象逻辑,以及判断一个类是否是动态代理类,以及InvocationHandler
的一个持有等等,那么我们这个抽象逻辑放在Proxy这个父类里面,很显然也是一个比较正常的一个思路
还可以怎么实现
我们可以选择cglib动态代理
,它会动态生成一个,被代理类的子类,子类重写父类非final修饰的方法,在子类中拦截父类的所有方法的一个调用,从而去实现动态代理