Java反射与动态代理:Spring AOP底层原理揭秘
📅 2026/8/1 1:55:56
👁️ 次浏览
一、前言反射与动态代理是 Java 高级特性重中之重也是 Spring 框架 AOP 实现底层原理。 反射允许程序在运行时获取类信息、操作对象动态代理依托反射实现无侵入增强目标对象功能。本文结合全套代码案例系统梳理核心知识点。二、反射机制2.1 什么是反射正常编码编译期直接new 对象()正向操作。 反射程序运行阶段获取类的全部信息构造器、成员变量、成员方法并且创建对象、修改变量、执行方法。核心先拿到 Class 字节码对象一切操作基于 Class。2.2 获取 Class 对象三种方式//方式1类名.class 【编译阶段无需对象】 ClassStudent clazz1 Student.class; //方式2对象.getClass() 【必须存在实例对象】 Student s new Student(); Class? extends Student clazz2 s.getClass(); //方式3Class.forName(全类名) 【最常用配置文件加载】 Class? clazz3 Class.forName(com.itheima.reflect.Student);重点同一个类在 JVM 中只会加载一份字节码三种方式获取的Class是同一个对象。2.3 反射核心 API 总览类型Class 方法作用构造方法 ConstructorgetConstructors()getDeclaredConstructors()获取所有公共构造器 / 所有构造器包含 private成员变量 FieldgetFields()getDeclaredFields()获取所有公共成员变量 / 全部成员变量成员方法 MethodgetMethods()getDeclaredMethods()获取所有公共方法 (含继承)/ 本类全部方法⚠️getXXX()只能获取publicgetDeclaredXXX()获取本类所有权限private/protected/public。setAccessible(true)暴力反射关闭权限检查允许访问私有成员。2.4 反射实战操作1操作构造方法创建对象//获取私有构造器 ConstructorStudent cons clazz.getDeclaredConstructor(String.class); cons.setAccessible(true); //暴力访问 Student stu cons.newInstance(张三);2操作成员变量赋值、取值Field nameField clazz.getDeclaredField(name); nameField.setAccessible(true); nameField.set(stu,李四); //赋值 String name (String) nameField.get(stu); //取值3操作成员方法运行方法Method showMethod clazz.getDeclaredMethod(show,String.class); showMethod.setAccessible(true); //invoke(对象,方法参数)执行方法 Object result showMethod.invoke(stu,测试参数);2.5 反射典型应用场景框架底层Spring Bean 实例化配合配置文件读取 properties通过全类名动态创建对象通用工具序列化、ORM 框架Mybatis实体类映射2.6 反射优缺点✅优点代码灵活运行时动态操作适配各类通用框架 ❌缺点破坏封装性跳过编译检查存在一定性能损耗三、动态代理3.1 代理思想代理模式不直接操作目标对象通过代理对象中转可以在不修改原有目标代码的前提下增加额外逻辑日志、事务、权限校验也就是无侵入增强。静态代理提前写好代理类一个目标类对应一个代理类类爆炸JDK 动态代理运行时自动生成代理类依托反射实现3.2 JDK 动态代理前置条件⚠️硬性要求目标对象必须实现接口代理对象和目标对象实现同一个接口保证对外方法一致。3.3 核心 APIjava.lang.reflect.Proxypublic static Object newProxyInstance(ClassLoader loader, Class?[] interfaces, InvocationHandler h)参数说明ClassLoader目标类的类加载器interfaces目标类实现的接口数组InvocationHandler回调处理器代理执行方法时触发InvocationHandler唯一方法Object invoke(Object proxy, Method method, Object[] args)proxy生成的代理对象method当前执行的目标方法args方法入参通过method.invoke(target,args)调用真实目标方法3.4 完整代码模板//1.定义接口 public interface Star { String sing(String name); void dance(); } //2.目标实现类 public class BigStar implements Star{ Override public String sing(String name) { System.out.println(唱歌name); return 歌曲结束; } Override public void dance() { System.out.println(跳舞); } } //3.代理工具类生成代理对象 public class ProxyUtil{ public static Star createProxy(Star target){ Star proxy (Star) Proxy.newProxyInstance( BigStar.class.getClassLoader(), BigStar.class.getInterfaces(), (proxyObj, method, args) - { //增强前置逻辑 System.out.println(准备场地、收取费用); //执行目标方法 Object res method.invoke(target,args); //增强后置逻辑 System.out.println(演出结束清理场地); return res; } ); return proxy; } } //4.测试调用 public class Test{ public static void main(String[] args) { Star target new BigStar(); Star proxy ProxyUtil.createProxy(target); proxy.sing(七里香); proxy.dance(); } }3.5 动态代理核心价值这是 Spring AOP 底层实现基础 在不改动业务代码的情况下统一增加日志记录、事务控制、异常捕获、权限校验。3.6 JDK 动态代理局限只能代理实现了接口的类没有接口的类无法使用。补充CGLIB 动态代理可以直接代理类底层通过继承目标类实现。四、整体总结反射核心运行时操作 Class 字节码操纵构造器、字段、方法暴力反射setAccessible(true)突破权限限制。反射经典场景框架动态创建对象、解析实体类。JDK 动态代理基于反射实现运行时动态生成代理类实现功能增强。JDK 动态代理约束目标类必须实现接口两大特性是学习 Spring AOP、MyBatis 等主流框架必须掌握的底层基础。
1. 从一次通信失败说起:为什么I2C协议值得深挖最近在调试一个传感器模块时,遇到了一个典型的I2C通信问题:主控(MCU)向一个I2C从设备发送读取指令后,迟迟收不到应答,SCL线被拉低,总线…
📅 2026/8/1 1:55:56
1. 从图数据库的“方言”说起:为什么是Gremlin?如果你最近在接触图数据库,无论是Neo4j、JanusGraph、Amazon Neptune还是Azure Cosmos DB Gremlin API,有一个名字你肯定绕不过去:Gremlin。它不像SQL那样家喻户晓&#…
📅 2026/8/1 1:55:56
1. 项目概述:SAP认证的价值与生态位如果你在ERP、企业信息化或者财务、供应链、生产制造这些领域工作,那么“SAP”和“SAP认证”这两个词,你大概率已经听过无数次了。它们就像行业里的“硬通货”和“敲门砖”,但具体是什么、怎么用…
📅 2026/8/1 1:54:54
场景错配的代价:从理论到实践的深度剖析
上周用Copilot生成财务数据清洗代码时的安全事件,揭示了一个关键问题:AI执行环境的错配可能带来灾难性后果。这个案例值得深入分析三个技术层面:
路径解析机制差异:云端环境通…
📅 2026/8/1 15:05:28
1. 从零开始:为什么“放置”是原理图设计的基石如果你刚开始接触ORCAD Capture,可能会觉得画原理图不就是把元器件拖出来,再用线连起来吗?这有什么好学的?我刚开始也是这么想的,直到我画的第一块板子&#…
📅 2026/8/1 15:05:28
在AI技术快速迭代的今天,开发者们经常面临模型使用限制带来的效率瓶颈。近期GPT-5.6 Sol版本通过优化使用限制重置机制,实现了18%的效率提升,这为处理长文本任务、复杂代码生成等场景提供了新的解决方案。本文将完整解析GPT-5.6 Sol的核心特性…
📅 2026/8/1 15:05:28
如何用3步解放求职时间:全平台自动化简历投递的终极指南 【免费下载链接】get_jobs 💼【AI找工作助手】全平台自动投简历脚本:(boss、前程无忧、猎聘、智联招聘) 项目地址: https://gitcode.com/gh_mirrors/ge/get_jobs
你是否还在为每…
📅 2026/8/1 15:05:28
3个步骤在M芯片Mac上运行iOS游戏:PlayCover完全指南 【免费下载链接】PlayCover Community fork of PlayCover 项目地址: https://gitcode.com/gh_mirrors/pl/PlayCover
想在Apple Silicon Mac上畅玩《原神》、《王者荣耀》等热门iOS游戏吗?PlayC…
📅 2026/8/1 15:05:28
1. 项目概述:为什么选择cxFreeze,以及它带来的挑战在Python开发者的世界里,将脚本或项目打包成一个独立的、可执行的文件(比如Windows上的.exe)是一个绕不开的“毕业课题”。无论是为了交付给没有Python环境的客户&…
📅 2026/8/1 15:04:27
AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言
HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…
📅 2026/8/1 0:00:26
无损视频剪辑终极指南:如何实现快速高效的多媒体处理 【免费下载链接】lossless-cut The swiss army knife of lossless video/audio editing 项目地址: https://gitcode.com/gh_mirrors/lo/lossless-cut
在数字媒体创作领域,视频编辑处理的质量损…
📅 2026/8/1 0:00:30
1. 本科生论文写作的AI辅助现状本科毕业论文是每个大学生必须跨越的一道坎。记得我当年写论文时,光是文献检索就花了整整两周时间,打印的参考文献堆满了半个书桌。如今AI技术的发展为学术写作带来了革命性变化,合理使用这些工具可以节省80%以…
📅 2026/8/1 0:00:30
更多请点击:
https://codechina.net
第一章:AI帮助理解数学概念 人工智能正以前所未有的方式重塑数学学习的路径。通过自然语言处理与符号计算的深度融合,AI不仅能解析抽象定义,还能将定理、证明和几何直觉转化为可交互、可验证的…
📅 2026/8/1 1:20:16
1. 项目背景与核心价值去年参与的一个短剧项目让我深刻体会到传统创作流程的痛点:编剧团队花了三周打磨剧本,角色设计反复修改了七版,最后成片时又因为演员档期问题不得不临时调整分镜。这种低效的创作模式在快节奏的内容行业越来越难以为继。…
📅 2026/8/1 1:20:19
remix-i18next TypeScript类型安全实践:确保翻译键与类型定义同步 【免费下载链接】remix-i18next The easiest way to translate your React Router framework mode apps 项目地址: https://gitcode.com/gh_mirrors/re/remix-i18next
在开发多语言应用时&am…
📅 2026/8/1 1:20:17
AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言
HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…
📅 2026/8/1 0:00:26
无损视频剪辑终极指南:如何实现快速高效的多媒体处理 【免费下载链接】lossless-cut The swiss army knife of lossless video/audio editing 项目地址: https://gitcode.com/gh_mirrors/lo/lossless-cut
在数字媒体创作领域,视频编辑处理的质量损…
📅 2026/8/1 0:00:30
1. 本科生论文写作的AI辅助现状本科毕业论文是每个大学生必须跨越的一道坎。记得我当年写论文时,光是文献检索就花了整整两周时间,打印的参考文献堆满了半个书桌。如今AI技术的发展为学术写作带来了革命性变化,合理使用这些工具可以节省80%以…
📅 2026/8/1 0:00:30