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

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

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

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

Proxy这个类只是保存了动态代理的一个处理器叫InvocationHandler如果不抽出来,直接设置在$ProxyO这个动态代理的里面我认为也是可以的,如果这么去实现的话,就可以针对类做动态的代理了,作者为什么这么设计,

3. 可以这么设计

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

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

4. 还可以怎么实现

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

  • 12
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

请叫我黄同学

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值