Java 反射机制

🔍 一、什么是 Java 反射机制?(是什么 & 能干嘛)

概念 Java 中的反射机制是一种运行时动态机制,允许程序在运行时:

访问、检测类和对象的内部信息(类名、方法、字段、构造器等)

调用对象的方法、修改对象字段 即使在编译时并不知道这些类、方法、字段的具体类型,也可以在运行时“翻出它们的说明书”并操作。

⭐ 核心关键词:

java.lang.Class:类的“说明书对象”

java.lang.reflect 包:Method、Field、Constructor 等反射类

🎯 二、Java 反射的作用(为什么需要)

反射机制允许程序在运行时对任意类/对象做这些事情:

在运行时判断任意一个对象所属的类

✅ 通过对象拿到类信息,例如类名、方法、字段、构造器。

在运行时构造任意一个类的对象

✅ 使用反射创建对象,而不需要直接 new。

在运行时判断任意一个类所有的成员变量和方法

✅ 遍历类的字段、方法(包括私有),并查看修饰符、参数等信息。

在运行时调用任意一个对象的方法

✅ 即使方法名在编译时未知,也可以通过字符串在运行时调用。

生成动态代理

✅ 利用反射生成类或接口的动态代理对象,用于 AOP、拦截器等。

⭐ 总结一句:反射 = 运行时“翻说明书 + 改说明书 + 用说明书干活”的能力。

⚙️ 三、反射的原理(底层是怎么实现的)

反射是通过类加载机制 + Class 对象 + 反射 API 实现的:

类的加载

当程序使用到某个类时,JVM 会通过类加载器(ClassLoader)把 .class 文件加载到内存中。

创建 Class 对象

加载过程中,JVM 会为每个类创建一个 Class 类型的对象(也就是“类对象”)。

这个 Class 对象中保存了类的元数据信息:类名、字段、方法、构造器等。

使用 Class 对象进行反射操作

程序可以通过反射 API(如 Class.forName()、obj.getClass()、.class 语法)获取到 Class 对象。

拿到 Class 对象之后,就能去:

访问类的元数据:getFields()、getMethods()……

创建实例:newInstance() 或通过 Constructor 创建

访问字段和方法:Field.get/set、Method.invoke

简化流程图:

[类加载] -> [为类创建 Class 对象] -> [通过反射 API 拿到 Class] -> [操作字段/方法/构造器]

📥 四、Java 获取反射的三种方式(获取 Class 对象)

目标:先拿到 Class 对象,后续所有反射操作都围绕它展开。

使用 Class.forName() 方法 ⭐

传递类的全限定名(包含包名)的字符串参数,适用于动态加载类。

示例:

Class c = Class.forName("java.lang.String");

通过 .class 语法

直接在类名后面使用 .class,在编译期就确定类,适用于已知类型的场景。

Class c = String.class;

使用对象的 getClass() 方法

对于任何对象,调用其 getClass() 方法获取运行时类型的 Class 对象,适用于已有对象实例的场景。

String s = "example";

Class c = s.getClass();

🌍 五、反射机制的典型应用场景

框架开发

如 Spring 的依赖注入、Hibernate 的 ORM 映射:

通过反射自动装配 Bean、访问/设置字段、调用方法、管理数据库操作。

插件化或模块化平台

⭐ 动态加载和运行第三方开发的插件/模块:

通过配置中写类名,运行时反射加载对应实现类。

单元测试框架

如 JUnit 使用反射来识别和执行测试方法(@Test 注解的方法)。

动态代理 / AOP

在运行时创建代理对象,用于拦截原始对象的方法调用,实现:

日志、权限、事务、监控等横切逻辑。

配置解析

解析并应用配置文件中的设置:

通过反射根据配置实例化指定类、给对象设置属性。

泛型类型擦除的补救

通过反射在运行时获取和操作泛型的实际参数类型(配合一些技巧,如注解或额外字段)。

✅ 六、小结(适合记忆的口径)

一句话记反射: “Java 反射机制允许程序在运行时检查和操作类/对象的内部结构,即使编译时并不知道具体类型。”

三种获取 Class 的方式:

Class.forName("全限定类名") —— 动态加载

类名.class —— 编译期已知类型

对象引用.getClass() —— 已有对象实例

核心应用:

框架开发(Spring/Hibernate)、插件化、测试框架、动态代理/AOP、配置解析、处理泛型信息。