动态代理和静态代理的区别

ps:如果这篇帖子对于还在找工作和找实习的你有所帮助,可以关注我,给本贴点赞、评论、收藏并订阅专栏;同时不要吝啬您的花花

代理模式是Java开发中常用的设计模式,核心作用是通过代理对象间接访问目标对象,实现功能增强、权限控制、日志打印、事务管理等非业务逻辑的解耦。根据代理类的生成时机和实现方式,分为静态代理动态代理,二者在开发效率、扩展性、底层原理上存在本质差异。

一、静态代理:编译期硬编码的固定代理

1. 核心定义

静态代理是在代码编译阶段,由开发者手动编写代理类源码,代理类和目标类实现同一个接口、持有目标对象引用,最终和目标类一起编译成class文件。代理逻辑提前写死在代码中,运行时直接调用编译好的代理类。

2. 实现特点

  • 手动编码:每个目标类都需要单独编写对应的代理类,代理类与目标类一一绑定
  • 编译期生成:代理类.java文件提前编写,javac编译后生成固定的代理类.class
  • 接口绑定:必须和目标类实现相同的接口,通过接口调用目标方法

3. 典型优缺点

优点:实现简单、直观,不需要依赖第三方框架,小场景下易调试;

缺点:代码冗余度极高,新增目标类/新增增强逻辑都要修改代理类,扩展性极差,不适合大规模业务开发。

二、动态代理:运行期动态生成的灵活代理

1. 核心定义

动态代理无需手动编写代理类源码,在程序运行阶段通过Java反射机制(JDK动态代理)或字节码生成技术(CGLIB动态代理),动态创建代理类对象并加载到JVM。代理逻辑统一封装,无需针对每个目标类单独开发,实现横切逻辑的复用。

2. 主流实现方案

  • JDK动态代理:Java原生支持,基于接口实现,目标类必须实现接口,通过InvocationHandler调用目标方法
  • CGLIB动态代理:第三方字节码框架,基于继承实现,无需目标类实现接口,通过生成目标类子类作为代理类

3. 核心特点

无手动代理类源码、运行时动态生成、一套增强逻辑可适配多个目标类、横切功能(日志、事务)可统一封装,彻底解耦业务与非业务代码。

三、静态代理 vs 动态代理:核心维度对比

代理类生成时机

编译期(提前编写.java文件,编译成.class)

运行期(JVM加载时动态生成字节码,无源码文件)

代码编写方式

手动硬编码,代理类与目标类一一对应

无需编写代理类,通过反射/字节码自动生成

代码复用性

极差,增强逻辑分散,无法复用

极强,一套增强逻辑适配所有目标类

灵活性

极低,新增方法/目标类需重写代理类

极高,动态适配目标类,无需修改原有代码

扩展性

差,维护成本高,不适合复杂场景

优,支持统一横切扩展,适配大规模项目

依赖要求

无第三方依赖,纯原生代码

JDK代理需接口,CGLIB需引入第三方包

运行性能

略高,无反射开销,直接调用

略低,存在反射/字节码生成开销(可忽略)

适用场景

目标类少、逻辑固定、简单业务场景

框架开发、AOP切面、事务管理、日志统一处理等复杂场景

四、关键总结:一句话分清二者

静态代理是“提前造好的固定工具”,针对性强但通用性差;动态代理是“运行时按需造工具”,通用性极强、扩展性拉满,是Spring AOP等主流框架的核心底层实现。

ps:如果这篇帖子对于还在找工作和找实习的你有所帮助,可以关注我,给本贴点赞、评论、收藏并订阅专栏;同时不要吝啬您的花花

Spring 文章被收录于专栏

本专栏聚焦Spring全生态体系,从IoC/AOP核心原理入手,覆盖Spring Boot自动配置、事务管理、Web开发等实战内容。拆解循环依赖、动态代理等高频面试难点,助力开发者从入门到精通,打通单体到微服务的技术链路,解决企业级开发痛点,提升架构设计与问题排查能力,成为Java后端进阶的必备技术专栏。

全部评论

相关推荐

前言:面试官说不方便开摄像头,而且有很大杂音,感觉应该是没在会议室设备不好之类的。不知道是不是KPI面面试总时长1个小时,没有录音,以下是回忆:1. 先在聊天里给了一个代码(主要与可变参数函数和越界访问段错误有关),让我判断编译能不能通过,运行会不会崩溃(这块是print函数输出,平时本菜狗很少用,连%d输出的是整数还是浮点都忘记了,尬死我了,但最后回答应该是没错的)2. 现在我在一个客户端向服务端发送数据,什么情况下会导致发送阻塞,底层原因是什么?(这里从socket发送缓冲区和TCP滑动窗口机制回答的)3. 直接开始项目,问了我的第一个项目,提了一嘴很少看到有人写这个,让我讲述一下动机,从前期技术选型到中期代码实现到后期优化测试都讲了一遍,然后问了项目中io_uring和eventfd实现、Reactor和Proactor模型区别,有栈协程和无栈协程,ucontext与其他协程上下文实现有做过对比(没做过)4. 问第二个项目,主要问了Raft算法,引申出一个分布式场景题:一个分布式集群,每个节点存储的数据量很大,其中一个节点宕机,为了恢复服务需要新加入一个节点,那么就要将其他节点的备份数据复制到新节点,问因为数据量很大,复制导致带宽占用很大,影响了其他节点的正常服务,你会如何解决?(答了在低峰期复制,在高峰期使用转发机制)5. 写项目的时候有没有用到AI,是如何用的?6. 如果让你借助AI从0实现一个Raft算法,你会如何与AI交流?7. 写给AI看的文档和写给人看的文档有什么区别?(内心OS:这是什么问题?)8. 反问:部门业务,实习时间要求,下一面时间(这里面试官说“在我这没问题”,是不是过了)
查看16道真题和解析
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
正在热议
更多
# 春招至今,你的战绩如何? #
11764次浏览 102人参与
# 你的实习产出是真实的还是包装的? #
2051次浏览 43人参与
# 米连集团26产品管培生项目 #
6184次浏览 216人参与
# 军工所铁饭碗 vs 互联网高薪资,你会选谁 #
7718次浏览 43人参与
# 简历第一个项目做什么 #
31813次浏览 344人参与
# 重来一次,我还会选择这个专业吗 #
433645次浏览 3926人参与
# 巨人网络春招 #
11396次浏览 223人参与
# 当下环境,你会继续卷互联网,还是看其他行业机会 #
187289次浏览 1122人参与
# 牛客AI文生图 #
21463次浏览 238人参与
# 不考虑薪资和职业,你最想做什么工作呢? #
152540次浏览 888人参与
# 研究所笔面经互助 #
118986次浏览 577人参与
# 简历中的项目经历要怎么写? #
310519次浏览 4227人参与
# AI时代,哪些岗位最容易被淘汰 #
64049次浏览 837人参与
# 面试紧张时你会有什么表现? #
30528次浏览 188人参与
# 你今年的平均薪资是多少? #
213232次浏览 1039人参与
# 你怎么看待AI面试 #
180298次浏览 1266人参与
# 高学历就一定能找到好工作吗? #
64348次浏览 620人参与
# 你最满意的offer薪资是哪家公司? #
76633次浏览 374人参与
# 我的求职精神状态 #
448229次浏览 3129人参与
# 正在春招的你,也参与了去年秋招吗? #
363673次浏览 2638人参与
# 腾讯音乐求职进展汇总 #
160718次浏览 1112人参与
# 校招笔试 #
471566次浏览 2964人参与
牛客网
牛客网在线编程
牛客网题解
牛客企业服务