当前位置: 首页 > news >正文

JDK动态代理为什么基于接口而不基于类?


文章目录

  • 引言
  • Java不支持多继承机制
  • JDK 动态代理是怎么生成类的
  • 那为什么CGLIB可以基于类
  • 面试级总结❤️

引言

在面试中很多时候会回答到JDK动态代理的相关问题,那么我们都知道JDK动态代理是基于接口的,如果被代理类没有实现某个接口,则无法使用JDK动态代理,而只能选择CGLIB代理。那么JDK动态代理为什么得基于接口,而不能兼容基于类呢?下面我们一起来讨论一下这个问题。

Java不支持多继承机制

我们知道Java不支持多继承(不能同时继承两个类),而是能通过实现接口的方式实现多继承的这种形式。

而这就是JDK动态代理基于接口,而不能基于类的原因。

JDK 动态代理是通过Proxy.newProxyInstance()在运行期生成一个 “实现目标接口的类”,该代理类的父类始终是java.lang.reflect.Proxy,不是你的目标类。代理类不能继承目标类,它不可能同时 extends Proxy 和 extends 你自己的类。

代理类extendsProxyimplements你的接口们

JDK 动态代理是怎么生成类的

ok,上面说了JDK动态代理不能基于类的根本原因,那么他是怎么根据我们自己的类生成代理类的呢?

如果你写:

UserServiceproxy=(UserService)Proxy.newProxyInstance(...);

JDK 会动态生成一个代理类(可以 dump 出文件看到),类似:

publicfinalclass$Proxy0extendsProxyimplementsUserService{publicvoidcreate(){// 所有方法最终转发到 InvocationHandler.invoke(...)h.invoke(this,method,args);}}

所以你能看到很重要的三点:

第一,代理类固定继承 Proxy

第二,代理类不会继承你的实现类

第三,代理类通过实现接口,所有方法都是转发到 InvocationHandler

上面就是JDK动态代理怎么生成类的大概流程

那为什么CGLIB可以基于类

因为 CGLIB 跟 JDK 动态代理完全不一样,它不是用 Proxy API,它是:

  • 直接用 ASM 操作字节码
  • 生成目标类的子类
  • 通过重写方法进行拦截
classUserServiceImpl$$EnhancerByCGLIBextendsUserServiceImpl{@Overridepublicvoidcreate(){// 调用 MethodInterceptor}}

面试级总结❤️

JDK 动态代理不能基于类的根本原因:

JDK 动态代理基于接口实现,生成的代理类固定继承自 Proxy,而 Java 不支持同时继承目标类,因此无法对类本身做代理。

CGLIB 能代理类的原因:

CGLIB 直接生成目标类的子类,通过字节码增强实现方法拦截,不依赖接口,不依赖 Proxy 的父类结构。

http://www.cnnetsun.cn/news/15572.html

相关文章:

  • ImageGPT技术解析:像素序列预测如何重构视觉AI底层架构
  • Beyond Compare 5 密钥生成完整指南:从原理到实战应用
  • 手艺人札记:在开源系统中重塑技术的温度
  • 5种方法彻底解决番茄小说离线下载难题
  • 史诗级漏洞警报:ASP.NET Core 被曝 CVSS 9.9 分漏洞,几乎所有.NET 版本无一幸免!
  • Cider音乐播放器终极指南:跨平台Apple Music体验全解析
  • 力扣刷题:最大子数组和
  • ⭐力扣刷题:岛屿数量
  • Screenbox媒体播放器:深度解析Windows平台的现代播放解决方案
  • 5步重构OpenSTM扫描隧道显微镜项目架构
  • DXVK终极配置手册:Linux游戏性能优化的完整解决方案
  • 活字格低代码平台:企业数字化转型的技术架构与实践剖析
  • NVIDIA CUDA 13.1权威指南:CUDA Tile驱动下一代GPU编程,性能全面提升
  • Figma中文界面完整指南:快速实现设计工具本地化
  • 重新定义AI视觉评估:多维度评分系统深度解析
  • Hap视频编解码器:专业级QuickTime硬件加速终极指南
  • 阿里Wan2.1开源:消费级GPU如何重塑视频创作生态
  • 40亿参数改写边缘AI规则:Qwen3-VL-4B-Thinking-FP8轻量化多模态革命
  • MATLAB图像导出专业指南:掌握export_fig的核心技术
  • AI浪潮下的新职业生态:技术角色的系统性演化
  • SQL优化实战:标量子查询改写外连接的真实案例
  • Claude Code 杀疯了!首创“后台实习生”模式,这才是真正的 AI 结对编程!
  • 多进程环境中解决 PHP 文件系统锁定问题指南
  • 浅谈InheritableThreadLocal---线程可继承的小书包
  • Jellyfin Android TV客户端音频播放异常问题深度解析
  • HFI高频方波注入方案stm32f405 无感FOC控制 直接闭环启动 永磁同步电机无感控制...
  • CTR预测系统构建实战:从FM到DeepFM的推荐算法演进之路
  • 从零玩转RT-Thread(22):定时器底层机制揭秘
  • B站缓存视频转换完整教程:m4s-converter高效管理本地视频
  • 解锁企业级后台管理:用Vue.js和Element-UI构建高效前端解决方案