Java 反射

类似JavaScript的DOM操作

可以理解为通过反射把一个类的属性,方法,拆分出来,作为一个对象来使用

例如拆分成

  • Class对象:代表类的类型信息,可以用来获取类的静态属性,创建对象实例等。
  • Field对象:代表类中的字段(成员变量),可以用来获取或设置字段的值。
  • Method对象:代表类中的方法,可以用来调用方法。
  • Constructor对象:代表类的构造器,可以用来创建对象实例。

假设您有一个名为Person的类,其中有一个名为name的字段和一个名为sayHello的方法。使用反射,您可以这样做:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
import java.lang.reflect.Field;
import java.lang.reflect.Method;

public class ReflectionExample {
public static void main(String[] args) {
try {
// 加载Person类
Class<?> personClass = Class.forName("Person");

// 创建Person类的实例
Object personInstance = personClass.getDeclaredConstructor().newInstance();

// 获取name字段
Field nameField = personClass.getDeclaredField("name");

// 设置name字段的值
nameField.setAccessible(true); // 如果字段是私有的,需要这样做
nameField.set(personInstance, "Alice");

// 获取sayHello方法
Method sayHelloMethod = personClass.getDeclaredMethod("sayHello");

// 调用sayHello方法
sayHelloMethod.invoke(personInstance);

} catch (Exception e) {
e.printStackTrace();
}
}
}

class Person {
private String name;

public Person() {
}

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