✅ 反射(Reflection)

反射 是 Java 提供的一种机制,可以在运行时动态获取类的信息、构造对象、调用方法、访问字段等。

✅ 通俗理解:反射就像“开外挂”,让你在运行时访问类的结构(包括私有的),甚至可以动态操作!


✅ 反射能干什么?

功能 举例说明
获取类的对象 Class cls = Class.forName("类的全路径");
创建对象 Object obj = cls.newInstance();
获取字段/方法/构造器 FieldMethodConstructor
访问私有成员 通过 setAccessible(true) 绕过访问控制
调用方法 method.invoke(obj, 参数);

✅ 获取 Class 对象的三种方式

1
2
3
4
5
6
7
8
9
// 1. 类名.class
Class<?> cls1 = String.class;

// 2. 对象.getClass()
String str = "hello";
Class<?> cls2 = str.getClass();

// 3. Class.forName("全类名")
Class<?> cls3 = Class.forName("java.lang.String");

✅ 示例:使用反射调用方法

目标类:

1
2
3
4
5
6
7
public class Person {
private String name = "张三";

public void sayHello() {
System.out.println("Hello, I am " + name);
}
}

反射调用:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import java.lang.reflect.Method;

public class ReflectTest {
public static void main(String[] args) throws Exception {
// 1. 获取 Class 对象
Class<?> cls = Class.forName("Person");

// 2. 创建对象
Object obj = cls.newInstance(); // 等价于 new Person()

// 3. 获取方法
Method method = cls.getMethod("sayHello");

// 4. 调用方法
method.invoke(obj);
}
}

✅ 访问私有属性

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import java.lang.reflect.Field;

public class ReflectFieldTest {
public static void main(String[] args) throws Exception {
Class<?> cls = Class.forName("Person");
Object obj = cls.newInstance();

Field nameField = cls.getDeclaredField("name");
nameField.setAccessible(true); // 打破私有访问限制
nameField.set(obj, "李四");

Method method = cls.getMethod("sayHello");
method.invoke(obj); // 输出:Hello, I am 李四
}
}

✅ 常用类

类名 功能
Class 表示类的字节码
Field 表示成员变量
Method 表示成员方法
Constructor 表示构造方法

✅ 反射的优缺点

优点 缺点
灵活、动态 效率低(反射开销大)
可以访问私有成员 安全性较差
常用于框架、工具开发 不建议频繁使用

✅ 应用场景

  • Java 框架(Spring、Hibernate 等)
  • 工具类(如 BeanUtils)
  • 动态加载类、插件系统
  • 序列化、反序列化
  • 注解处理器