HomeWork Java 反射机制入门:打破封装,动态操作类
2026.05.08
反射(Reflection)是 Java 的核心特性之一,它让我们能在运行时动态获取类的信息、创建对象、调用方法、访问属性。今天我们就来搞懂反射的基础用法和适用场景。
一、什么是反射?
正常情况下,我们是编译时确定类和对象的关系,而反射让我们能在运行时做这些事:
- 获取类的 Class 对象;
- 获取类的构造器、方法、字段;
- 动态创建对象、调用方法、修改属性;
- 突破访问权限限制,访问私有成员。
二、反射的基础用法示例
我们以一个简单的User类为例,演示反射的基本操作。
步骤 1:定义测试类
public class User {
private String name;
private int age;
public User() {}
public User(String name, int age) {
this.name = name;
this.age = age;
}
public void sayHello() {
System.out.println("Hello, my name is " + name + ", I'm " + age + " years old.");
}
private void privateMethod() {
System.out.println("这是一个私有方法");
}
// getter & setter
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
步骤 2:获取 Class 对象的三种方式
public class ReflectionTest {
public static void main(String[] args) throws Exception {
// 方式1
Class<User> clazz1 = User.class;
// 方式2
User user = new User();
Class<? extends User> clazz2 = user.getClass();
// 方式3(最常用)
Class<?> clazz3 = Class.forName("com.example.User");
}
}
步骤 3:反射创建对象、调用方法、修改属性
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class ReflectionTest {
public static void main(String[] args) throws Exception {
Class<?> clazz = Class.forName("com.example.User");
// 创建对象
User user = (User) clazz.newInstance();
// 修改私有属性 name
Field nameField = clazz.getDeclaredField("name");
nameField.setAccessible(true);
nameField.set(user, "张三");
// 修改私有属性 age
Field ageField = clazz.getDeclaredField("age");
ageField.setAccessible(true);
ageField.set(user, 18);
// 调用公有方法
Method sayHello = clazz.getMethod("sayHello");
sayHello.invoke(user);
// 调用私有方法
Method privateMethod = clazz.getDeclaredMethod("privateMethod");
privateMethod.setAccessible(true);
privateMethod.invoke(user);
}
}
三、反射的适用场景
- 框架开发:Spring 的 IOC、AOP,ORM 框架的数据库映射,都大量使用反射;
- 动态代理:JDK 动态代理基于反射实现;
- 序列化 / 反序列化:JSON 框架(如 FastJSON、Jackson)用反射解析对象;
- 工具类开发:比如对象拷贝、耗时统计、日志增强等通用工具。
更多推荐
所有评论(0)