news 2026/6/10 15:32:33

【从0开始学习Java | 第23篇】动态代理

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【从0开始学习Java | 第23篇】动态代理

重阳,来啦!第23篇我们聊动态代理——这是Java面试中中高级岗必问、Spring AOP底层核心、MyBatis插件、RPC框架都离不开的知识点。

学会动态代理 = 直接秒杀 80% 的候选人!

一、先搞清楚:到底什么是代理?

生活例子:
你想找周杰伦签名 → 你不会直接找周杰伦 → 你找他的经纪人(代理)→ 经纪人帮你转达、加点要求(唱歌前先喝热水)、最后还是周杰伦签的名。

Java里的代理就是这个道理。

二、静态代理 vs 动态代理(超级清晰对比)

项目静态代理动态代理(今天主角)
代理类写法自己手动写一个代理类运行期间由JVM自动生成代理类
代码量一个接口要写一个代理类,接口多了爆炸无论多少接口,一个动态代理搞定
灵活性改个需求要改代理类代码完全动态,随时换增强逻辑
典型场景早期手写日志、事务Spring AOP、MyBatis Plugin、Dubbo等

结论:静态代理只是教学用的,真实项目99.9%用动态代理!

三、Java动态代理有两种方式(2026年仍然是这俩)

  1. JDK动态代理(必须实现接口)← 今天重点,面试问90%
  2. CGLIB动态代理(可以代理没有接口的类)← Spring默认用这个当目标类没接口

我们先把JDK动态代理吃透!

四、JDK动态代理完整实现(手敲3遍就能背出来)

场景:明星只有唱歌的功能,我们要在唱歌前后自动加“收钱”和“宣传”
// 1. 定义通用能力接口publicinterfaceStar{voidsing(StringsongName);// 唱歌Stringdance();// 跳舞(有返回值)}
// 2. 真实明星:周杰伦publicclassJayChouimplementsStar{@Overridepublicvoidsing(StringsongName){System.out.println("周杰伦唱:"+songName+",收1000万!");}@OverridepublicStringdance(){System.out.println("周杰伦跳舞很帅~");return"舞王";}}
// 3. 动态代理的核心:InvocationHandler(真正干活的地方!)importjava.lang.reflect.InvocationHandler;importjava.lang.reflect.Method;publicclassStarHandlerimplementsInvocationHandler{privatefinalStartarget;// 被代理的真实对象publicStarHandler(Startarget){this.target=target;}@OverridepublicObjectinvoke(Objectproxy,Methodmethod,Object[]args)throwsThrowable{// 前置增强System.out.println("【经纪人】接活,谈价格,签合同...");// 调用真实对象的方法(这句是灵魂!)Objectresult=method.invoke(target,args);// 后置增强System.out.println("【经纪人】宣传、发微博、收尾款...");returnresult;// 一定要返回!不然有返回值的方法会返回null}}
// 4. 测试类:真正使用动态代理的地方importjava.lang.reflect.Proxy;publicclassTestDynamicProxy{publicstaticvoidmain(String[]args){// 真实对象Starjay=newJayChou();// 创建InvocationHandlerStarHandlerhandler=newStarHandler(jay);// 关键三行:运行时动态生成代理对象!!!StarproxyStar=(Star)Proxy.newProxyInstance(jay.getClass().getClassLoader(),// 类加载器jay.getClass().getInterfaces(),// 被代理类实现的所有接口handler// InvocationHandler);// 使用代理对象(完全感觉不到背后有经纪人)proxyStar.sing("稻香");StringdanceResult=proxyStar.dance();System.out.println("跳舞评价:"+danceResult);// 看看代理对象到底是谁?System.out.println("代理对象真实类型:"+proxyStar.getClass().getName());// 输出:$Proxy0 (JVM动态生成的类)}}

运行结果:

【经纪人】接活,谈价格,签合同... 周杰伦唱:稻香,收1000万! 【经纪人】宣传、发微博、收尾款... 【经纪人】接活,谈价格,签合同... 周杰伦跳舞很帅~ 【经纪人】宣传、发微博、收尾款... 跳舞评价:舞王 代理对象真实类型:com.sun.proxy.$Proxy0

五、最重要的三行代码背下来(面试必问)

StarproxyStar=(Star)Proxy.newProxyInstance(target.getClass().getClassLoader(),target.getClass().getInterfaces(),newStarHandler(target));

这三行就是JDK动态代理的全部精华!

六、面试官最爱问的10个问题(全部背熟)

  1. 动态代理和静态代理区别?
  2. JDK动态代理为什么必须实现接口?
  3. Proxy.newProxyInstance 三个参数分别是什么?
  4. InvocationHandler 的 invoke 方法三个参数是什么?
  5. 如果被代理类没有接口,能用JDK动态代理吗?→ 不能!用CGLIB
  6. Spring中默认用哪个?→ 有接口用JDK,没有接口用CGLIB(Spring Boot2.x后默认CGLIB)
  7. 动态代理生成的 $Proxy0 是什么?能反编译看看吗?
  8. 方法有返回值时,invoke里要不要return?→ 必须return method.invoke(…)
  9. 动态代理的底层实现原理?→ 就是上面这套反射 + 动态生成字节码
  10. 能手写一个动态代理吗?→ 现在你能闭着眼敲出来了!

七、终极小练习(建议你现在就敲一遍)

需求:用动态代理实现一个通用日志记录器,对任意对象的所有方法调用都自动打印:

---> 开始执行:sing(稻香) <--- sing执行结束,耗时:15ms

提示:可以在invoke里记录System.currentTimeMillis()

结语

重阳,恭喜你!
当你能完全手敲出上面的动态代理代码时,恭喜你已经超越了市面上 80% 的 Java 程序员!

这就是为什么Spring能用几行注解就实现事务、缓存、权限控制的底层原理!

下一节我们直接上CGLIB动态代理 + 手撕Spring AOP底层原理,准备好了吗?

现在你可以:

  1. 把上面代码完整敲一遍(必须!)
  2. 告诉我你跑通了吗?有没有遇到什么问题?
  3. 想直接看CGLIB还是先来几个动态代理的变态面试题?

我在等你~ 来吧!冲!

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

【小程序毕设全套源码+文档】基于微信小程序django咖啡博物馆预约小程序的设计与实现(丰富项目+远程调试+讲解+定制)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华
网站建设 2026/6/10 1:17:07

可编辑PPT | 数据治理与标准推动数据成为“金矿”

一、工业互联网与数据中台 PPT强调了智能制造的核心要素是数据、模型和知识&#xff0c;这些要素共同构成了智能工厂的基础。智能工厂的构建涉及业务模型的构建、仿真预测和智能决策等方面&#xff0c;以实现生产过程的自动化和优化。 工业互联网架构则着重于数据的利用&#…

作者头像 李华
网站建设 2026/6/10 12:53:45

强烈安利8个降AIGC网站,千笔AI帮你轻松降AI率

AI降重工具&#xff1a;让论文更自然&#xff0c;更安心 在当前的学术环境中&#xff0c;越来越多的高校和期刊开始使用AIGC检测系统来识别AI生成内容。对于本科生来说&#xff0c;这无疑增加了论文写作的难度。如何在保持原意不变的前提下&#xff0c;有效降低AI痕迹和查重率&…

作者头像 李华
网站建设 2026/6/10 12:41:23

嵌入式C++教程——ETL(Embedded Template Library)

嵌入式C教程——ETL&#xff08;Embedded Template Library&#xff09; 好奇心&#xff1a;为什么在嵌入式世界里&#xff0c;总有人把 new 当成“危险品”而随身带手套&#xff1f;答案很简单&#xff1a;堆是不可预测的。ETL&#xff08;Embedded Template Library&#xf…

作者头像 李华