Java反射:打破封装的“透视眼”,运行时玩转类的一切!
🔥 前言:
你是否曾好奇——Spring为啥能“自动装配”对象?MyBatis为啥只写接口就能执行SQL?这些框架的“黑魔法”背后,都离不开一个核心技术:反射(Reflection)!
如果说普通编程是“按规矩办事”(只能调用public方法、访问public属性),那反射就是给Java开了“上帝视角”——哪怕是类的私有成员,只要你想,都能在运行时动态获取、修改、调用。今天就带大家手撕反射,从“小白视角”把这个知识点玩明白~
一、什么是反射?——给类装个“全身CT”
📖 官方定义
反射(Reflection)允许程序在运行期间动态获取、访问类的所有信息(属性、方法、构造器、注解等),突破编译器的语法检查。
🎭 通俗比喻
平时我们用一个类,就像用一个封装好的礼盒:只能通过商家指定的方式打开(调用public方法),看不到里面的细节。
而反射就像给礼盒做了“全身CT”:不管是外层包装(public成员),还是内层隐私(private成员),都能看得一清二楚,甚至还能直接修改里面的东西!
💡 反射的本质
JVM加载.class文件时,会在堆内存中生成一个唯一的Class对象(每个类只有一个),这个对象包含了类的所有“元数据”(属性、方法、构造器等)。反射的所有操作,本质都是对这个Class对象的“读/写”。
二、Class类——反射的“总说明书”
想要玩反射,第一步必须拿到Class对象——它就像类的“产品总说明书”,有了它才能查构造、找方法、改属性。
📌 三种获取Class对象的方式(附场景)
| 方式 | 语法 | 适用场景 |
| 类名.class |
| 编译期已知类,代码更简洁 |
| 对象.getClass() |
| 已有对象实例,想获取其Class对象 |
| Class.forName() |
| 运行时动态加载(框架核心用法) |
三、玩转构造器——Constructor类(造对象的“万能工厂”)
Constructor类是“构造方法的说明书”,通过它能指定任意构造器创建对象——哪怕是私有构造器(比如破解单例模式)!
📚 核心方法
| 方法 | 作用 |
|
| 获取所有公共构造器 |
|
| 获取所有构造器(包括私有) |
|
| 获取单个公共构造器 |
|
| 获取单个构造器(包括私有) |
|
| 根据构造器创建对象 |
🔧 代码示例:用反射创建User对象
✨ 关键点:访问私有成员时,必须调用setAccessible(true)取消JVM的访问检查!
四、拿捏成员变量——Field类(修改属性的“魔法棒”)
Field类是“属性的说明书”,能读取/修改任意属性值——哪怕是private、final修饰的(final修饰的属性也能改,只是不推荐)!
📚 核心方法
| 方法 | 作用 |
|
| 获取所有公共属性 |
|
| 获取所有属性(包括私有) |
|
| 获取单个公共属性 |
|
| 获取单个属性(包括私有) |
|
| 读取属性值 |
|
| 修改属性值 |
🔧 代码示例:修改User的私有属性
五、调用任意方法——Method类(远程遥控“方法开关”)
Method类是“方法的说明书”,能调用任意方法——包括private方法,还能接收返回值!
📚 核心方法
| 方法 | 作用 |
|
| 获取所有公共方法(包括父类的) |
|
| 获取所有方法(仅当前类,包括私有) |
|
| 获取单个公共方法 |
|
| 获取单个方法(包括私有) |
|
| 调用方法,返回值为Object类型 |
🔧 代码示例:调用User的私有方法
六、识别注解——Annotation类(标签识别器)
Annotation类是“注解的说明书”,能判断类/方法/字段是否加了指定注解,还能读取注解的属性值——这是Spring注解驱动的核心!
📚 核心方法
| 方法 | 作用 |
|
| 获取所有公共注解 |
|
| 获取所有注解(包括私有) |
|
| 判断是否加了指定注解 |
|
| 获取指定注解对象 |
🔧 代码示例:读取自定义注解
七、反射的“坑”与实战场景
⚠️ 反射的缺点
-
破坏封装性:能直接访问私有成员,违背面向对象的封装原则;
-
性能略低:反射是运行时动态解析,比直接调用慢(但框架层面的优化可忽略);
-
代码可读性降低:动态操作类,代码不如直接调用直观。
🚀 反射的核心应用场景
-
框架开发:Spring IOC/AOP、MyBatis、Hibernate等框架的核心;
-
动态代理:比如Spring的事务管理、日志切面;
-
配置解析:读取配置文件动态创建对象(比如数据库连接池);
-
工具类开发:比如BeanUtils(对象属性拷贝)。
🎯 总结
-
反射的核心是Class对象——它是类的“总说明书”,三种获取方式要记牢;
-
反射能操作类的所有成员(构造、属性、方法、注解),访问私有成员需加
setAccessible(true); -
反射是框架的“灵魂”,虽然有性能和封装性的小缺点,但却是Java动态编程的核心!
💬 互动:你还知道反射的哪些有趣用法?评论区聊聊~
如果这篇文章对你有帮助,别忘了点赞+收藏+关注哦!🚀









