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

12 java面试题: JDK 动态代理 CGLIB 动态代理 的区别和联系是什么

这个问题问得很全面,不仅问了“区别”,还问了“联系”。在面试中,能讲清楚“联系”往往是拉开差距的关键。

我直接为你提炼一套**“区别 + 联系”**的满分回答逻辑,你按这个思路说,面试官一定会认可。


一、核心区别(机制与场景)

先说最本质的区别,一句话概括:

JDK 动态代理是“基于接口”的代理(亲儿子),CGLIB 是“基于继承”的代理(干儿子)。

围绕这个核心,区别体现在以下五个维度:

对比维度JDK 动态代理CGLIB 动态代理
实现原理运行时生成一个实现了目标接口的匿名代理类。运行时通过操作字节码(ASM框架),生成一个继承自目标类的子类代理对象。
目标类要求必须实现至少一个接口。不需要实现接口,普通类即可。
方法限制只能代理接口中定义的方法(即public抽象方法)。能代理类中所有非final、非static的方法final方法无法被重写)。
性能(JDK 1.8+)方法调用性能更优(JVM 做了内联优化)。创建代理对象速度较快,但方法调用性能稍慢于 JDK。
依赖JDK 原生自带,无需额外引入包。需引入cglib包(Spring 3.2+ 已内嵌 ASM 源码)。

二、深层联系(它们本质上是“兄弟”)

很多候选人只答区别,不提联系。如果你能说出下面这几点,就是加分项

  1. 本质相同(都是运行时字节码增强)
    两者都不是在编译期修改源码,而是在JVM 运行时动态生成新的 Class 字节码,并加载到内存中,以此来拦截目标方法,实现无侵入的增强(AOP)。

  2. 目的相同(都是方法拦截与代理)
    最终目的都是为了对目标方法进行增强(如日志、事务、权限校验)。它们都通过一个类似“调度器”的组件来分发调用:

    • JDK 靠InvocationHandler.invoke()
    • CGLIB 靠MethodInterceptor.intercept()
  3. 都依赖类加载器(ClassLoader)
    动态生成的代理类都必须通过ClassLoader加载到 JVM 中才能使用。

  4. 在现代框架中“协同共存、互补使用”(这是最重要的联系):
    它们不是谁取代谁的关系,而是互补关系。以Spring 框架为例:

    Spring AOP 默认的底层策略是:如果目标类实现了接口,就用 JDK 代理;如果没有实现接口,就用 CGLIB 代理。

    也就是说,Spring 把它们当作两种工具放在工具箱里,按需取用。如果你强制设置proxy-target-class = true,Spring 也会放弃 JDK,统一用 CGLIB。


三、面试金句(帮你总结)

如果面试官再追问“你觉得哪个更好?”,你可以这样收尾:

“在我看来,它们并不是鱼和熊掌的关系。JDK 动态代理是官方原生方案,轻量高效,但受限于接口;CGLIB 是强大的补充方案,弥补了无接口类的代理需求,但受限于final关键字。现代开发中,我们应遵循‘接口优先’的设计原则,默认用 JDK 代理;只有在确实没有接口或必须代理非public方法时,才退而求其次选用 CGLIB。”


这样回答,既讲清了区别,又点明了它们在框架层面的联系与协作,层次非常清晰。现在 JDK 和 CGLIB 的区别与联系已经讲透了,你还需要我结合Spring 源码,具体讲讲它是如何通过DefaultAopProxyFactory类智能选择这两种代理方式的吗?想深入的话我可以继续为你拆解。😊

http://www.jsqmd.com/news/1093261/

相关文章:

  • 【精通】SmartWriter v2.3:流式写作引擎 — Streaming 五种模式深度实战
  • 【黑科技软件】windows电脑鼠标连点器:自动连点+录制回放+屏幕识图,一款软件全搞定(支持中文)
  • 背景介绍与痛点分析
  • Ubuntu CentOS 安装配置SSH完整教程
  • 2026年Vue3项目架构从零到一:目录、分层、代码,每一行都给你说明白
  • ISP Pipeline中径向递减锐化方案实现(四)
  • 华为MetaERP Oracle EBS、SAP(S/4HANA)、华为 MetaERP 全体系深度对比 + 实操业务示例总览三大产品定位Oracle EBS R12:美国甲骨文传统成熟 ERP,
  • 深度解析STL缩略图生成器:Windows文件资源管理器3D预览完整实现指南
  • Day5:用户端用例执行与缺陷管理
  • 一、linux系统安装与环境准备
  • YgoMaster终极PvP对战指南:如何轻松实现局域网联机与好友对战
  • 基于大数据+Hadoop的多维度用户画像构建与个性化推荐应用研究
  • 中山市电感微久智造蜘蛛手编带机厂家
  • 游戏程序化内容生成地形建筑与任务
  • 【Excel】使用“数据透视表”统计所有项的工作量
  • Google Play大改版,AI全面进入 ,游戏出海的商店逻辑全变了
  • VerSprite推出Fork和Knife:专为现代软件开发速度打造的AI驱动型威胁建模与对抗性测试平台
  • 认知操作系统与组织死亡学:贾子理论大厦的元理论建构及其文明意涵
  • 部署 AI 总卡在依赖 / 端口?Hermes Windows 极简方案拆解
  • 把 Flask 搬进 ESP32,高中生自研嵌入式 Web 框架 MicroFlask !
  • 我觉得目前脚本速度已经足够快了-----再快就不像人了
  • 代码图片生成器推荐,浏览器搜索Carbon。
  • API Key 填了还是 401?先检查这 5 个地方
  • 华为MetaERP 财务 ERP 解决方案架构师(EBS+SAP+MetaERP 复合背景)全国需求现状 + 城市潜力分级一、全国整体市场需求(2026 年现状)1. 需求整体判断:结构性紧缺,复
  • 【限时解密】ChatGPT API费用优化白皮书(含23个真实客户账单审计案例+自动识别高成本prompt的CLI工具)——OpenAI Partner认证专家独家释放
  • 从Isaac物理引擎到85kg重载轮足机甲:全栈架构复盘与Sim-to-Real避坑指南
  • 重新掌控惠普暗影精灵性能:OmenSuperHub开源控制工具完全指南
  • 分布式量子计算与NetQMPI框架核心技术解析
  • 复盘:企业级 Agent 平台,落地踩过的坑
  • rabbitmq+websocket实时通知