Java 反射机制
- 反射的核心类
- 获取 Class 对象的三种方式
- 反射的基本操作
反射的核心类
| 类名 | 作用 |
|---|
| Class | 代表类的元数据 |
| Field | 代表类的成员变量 |
| Method | 代表类的方法 |
| Constructor | 代表类的构造方法 |
| Array | 提供动态创建和访问数组的方法 |
获取 Class 对象的三种方式
Class<?> clazz1 = String.class;
String str = "Hello";
Class<?> clazz2 = str.getClass();
Class<?> clazz3 = Class.forName("java.lang.String");
反射的基本操作
创建对象
Class<?> clazz = Class.forName("com.example.User");
Object obj = clazz.newInstance();
Constructor<?> constructor = clazz.getConstructor(String.class, int.class);
Object obj = constructor.newInstance("张三", 25);
访问字段
public class Main {public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException {User user = new User("张三", 20);Class<?> clazz = user.getClass();Field publicField = clazz.getField("name");Object nameValue = publicField.get(user);System.out.println("反射获取name: " + nameValue);publicField.set(user, "李四");System.out.println("修改name后: " + user);Field privateField = clazz.getDeclaredField("age");privateField.setAccessible(true); Object ageValue = privateField.get(user);System.out.println("反射获取age: " + ageValue);privateField.set(user, 30);System.out.println("修改age后: " + user);Method publicMethod = clazz.getMethod("setName", String.class);publicMethod.invoke(user, "王二狗");System.out.println("调用setName后: " + user);Method privateMethod = clazz.getDeclaredMethod("privateMethod");privateMethod.setAccessible(true);privateMethod.invoke(user);}
}@Data
@AllArgsConstructor
public class User implements Serializable {public String name; private int age;
}
反射可以绕过泛型检查:
List<String> list = new ArrayList<>();list.add("hello");Method addMethod = list.getClass().getMethod("add", Object.class);addMethod.invoke(list, 100); System.out.println(list);