news 2026/7/7 0:31:56

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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 的父类结构。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/4 13:07:43

tModLoader终极指南:解锁泰拉瑞亚无限可能

当你站在泰拉瑞亚的星空下,是否曾幻想过:如果这个世界还有更多未知等待探索该有多好?tModLoader正是实现这个梦想的钥匙。作为官方认证的模组加载器,它为你打开了通往无限创意世界的大门。 【免费下载链接】tModLoader A mod to m…

作者头像 李华
网站建设 2026/7/5 18:11:19

6倍提速+75%显存节省:Kimi Linear如何改写大模型效率规则

6倍提速75%显存节省:Kimi Linear如何改写大模型效率规则 【免费下载链接】Kimi-Linear-48B-A3B-Instruct 项目地址: https://ai.gitcode.com/MoonshotAI/Kimi-Linear-48B-A3B-Instruct 导语 2025年10月,月之暗面科技发布Kimi Linear混合线性注意…

作者头像 李华
网站建设 2026/7/6 4:31:59

2025年AI会议管理的三大智能革命:从时间追踪到学术决策支持

在人工智能研究领域,时间管理不再是简单的日历提醒,而是决定研究成果发表时机和学术影响力的关键因素。传统的学术时间规划往往面临信息碎片化、决策依据不足等挑战,而AI Deadlines的出现正在彻底改变这一现状。本文将深度解析如何通过智能学…

作者头像 李华
网站建设 2026/7/4 20:37:44

遥感图像变化检测终极指南:Open-CD快速上手与实战应用

遥感图像变化检测终极指南:Open-CD快速上手与实战应用 【免费下载链接】open-cd 项目地址: https://gitcode.com/gh_mirrors/op/open-cd 遥感图像变化检测作为AI视觉分析的重要分支,在环境监测、城市规划、灾害评估等领域发挥着关键作用。Open-C…

作者头像 李华
网站建设 2026/7/6 6:28:08

重新认识 Golang 中的 json 编解码

是我的老朋友,上份工作开发 web 应用时就作为前后端数据交流的协议,现在也是用 json 数据持久化到数据库。虽然面熟得很但还远远达不到知根知底,而且在边界的探索上越发束手束脚。比如之前想写一个范型的结构提高通用性,但是不清楚…

作者头像 李华