news 2026/9/12 9:36:57

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/9/10 15:10:35

为什么说“能清晰表达任务”才是未来最值钱的能力?

——一个智能体工程师的底层观察过去两年,我一直在做一件事:把 AI 从“好玩”变成“好用”。越深入智能体系统(Agent System),我越确信一件事:未来最核心的能力,不是会写代码,不是会…

作者头像 李华
网站建设 2026/9/11 22:54:31

Windows 11离线安装.NET Framework 3.5:终极完整指南

Windows 11离线安装.NET Framework 3.5:终极完整指南 【免费下载链接】已解决Win11离线安装.NETFramework3.5完全指南 【已解决】Win11离线安装.NET Framework 3.5完全指南 项目地址: https://gitcode.com/Resource-Bundle-Collection/d5cb0 还在为Windows 1…

作者头像 李华
网站建设 2026/9/12 8:23:50

Capacitor iOS开发中SPM依赖管理的完整实践指南

Capacitor iOS开发中SPM依赖管理的完整实践指南 【免费下载链接】capacitor Build cross-platform Native Progressive Web Apps for iOS, Android, and the Web ⚡️ 项目地址: https://gitcode.com/gh_mirrors/ca/capacitor 在Capacitor iOS开发过程中,依赖…

作者头像 李华
网站建设 2026/9/11 23:00:28

Inventor 二次开发从入门到精通(3)

3.1 Inventor API 的架构设计Inventor API 采用COM 组件架构,基于面向对象的设计思想,所有操作都通过对对象的调用实现。其核心架构可分为三层:应用层(Application):代表 Inventor 应用程序本身&#xff0c…

作者头像 李华
网站建设 2026/9/11 8:58:00

PyBlueZ完整指南:快速掌握Python蓝牙开发核心技术

PyBlueZ完整指南:快速掌握Python蓝牙开发核心技术 【免费下载链接】pybluez Bluetooth Python extension module 项目地址: https://gitcode.com/gh_mirrors/py/pybluez PyBlueZ是一个强大的Python蓝牙扩展模块,让开发者能够轻松访问主机的蓝牙资…

作者头像 李华
网站建设 2026/9/11 20:28:14

如何做一个成功的品牌网站?这4点很关键!

网站建设市场的快速开展,不同层次需求的划分愈加的透明。有高端定制网站建设,也有一般网站建设,随着互联网的持续发展,网站建设也会逐步走向专业化、定制化,为人呈现一种专业性的视觉体会。根据不同的需求提供不同的建…

作者头像 李华