一、什么是反射?
Java反射(Reflection)是Java语言的核心特性之一,它允许程序在运行时(Runtime)动态地操作类和对象。通过反射API,我们可以在程序运行期间:
- 获取任意类的Class对象
- 构造任意类的实例
- 访问任意类的字段和方法
- 调用任意对象的方法
- 操作数组
- 实现动态代理
// 获取Class对象的三种方式
Class<?> clazz1 = String.class; // 类.class
Class<?> clazz2 = "Hello".getClass(); // 对象.getClass()
Class<?> clazz3 = Class.forName("java.lang.String"); // 全类名加载
二、反射的核心作用
获取任意一个类中的所有信息,结合配置文件动态创建对象
1. 动态编程
反射打破了Java的静态类型约束,使得程序可以:
- 动态加载未在编译期引用的类
- 运行时决定要实例化的类
- 实现跨模块的灵活调用
2. 框架设计的基石
主流的Java框架都深度依赖反射:
- Spring:依赖注入、AOP
- Hibernate:ORM映射
- JUnit:测试用例发现
- MyBatis:SQL映射
3. 通用工具开发
反射是开发通用工具类的基础:
- 对象序列化/反序列化
- 深度拷贝工具
- 动态代理生成
- 注解处理器
三、反射示例代码
// 1. 获取Class对象
Class<?> userClass = Class.forName("com.example.User");
// 2. 创建实例
Constructor<?> constructor = userClass.getConstructor(String.class, int.class);
Object user = constructor.newInstance("张三", 25);
// 3. 访问字段
Field ageField = userClass.getDeclaredField("age");
ageField.setAccessible(true); // 突破私有访问限制
ageField.set(user, 26);
// 4. 调用方法
Method toStringMethod = userClass.getMethod("toString");
String result = (String) toStringMethod.invoke(user);
System.out.println(result); // 输出:User{name='张三', age=26}