反射的核心类

类名 作用
Class 代表类的元数据
Field 代表类的成员变量
Method 代表类的方法
Constructor 代表类的构造方法
Array 提供动态创建和访问数组的方法

获取 Class 对象的三种方式

// 1. 通过类名.class
Class<?> clazz1 = String.class;

// 2. 通过对象.getClass()
String str = "Hello";
Class<?> clazz2 = str.getClass();

// 3. 通过Class.forName()
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 {
        // 1. 创建测试对象
        User user = new User("张三", 20);

        // 2. 获取Class对象
        Class<?> clazz = user.getClass();

        // 3. 操作public字段
        Field publicField = clazz.getField("name");
        Object nameValue = publicField.get(user);
        System.out.println("反射获取name: " + nameValue);// 反射获取name: 张三

        publicField.set(user, "李四");
        System.out.println("修改name后: " + user);// 修改name后: User(name=李四, age=20)

        // 4. 操作private字段
        Field privateField = clazz.getDeclaredField("age");
        privateField.setAccessible(true); // 解除private限制

        Object ageValue = privateField.get(user);
        System.out.println("反射获取age: " + ageValue);// 反射获取age: 20

        privateField.set(user, 30);
        System.out.println("修改age后: " + user);// 修改age后: User(name=李四, age=30)
         // 获取public方法
        Method publicMethod = clazz.getMethod("setName", String.class);
        // 调用方法
        publicMethod.invoke(user, "王二狗");
        System.out.println("调用setName后: " + user);// 调用setName后: User(name=王二狗, age=30)

        
        // ================== 调用private方法 ==================
        // 获取private方法
        Method privateMethod = clazz.getDeclaredMethod("privateMethod");
        // 解除private限制
        privateMethod.setAccessible(true);
        // 调用方法
        privateMethod.invoke(user);
    }
}

@Data
@AllArgsConstructor
// 可序列化的User类
public class User implements Serializable {
    public String name;  // public字段
    private int age;     // private字段
}

反射可以绕过泛型检查:

 List<String> list = new ArrayList<>();
        list.add("hello");

        Method addMethod = list.getClass().getMethod("add", Object.class);
        addMethod.invoke(list, 100);  // 绕过了泛型检查

        System.out.println(list);  // 输出: [hello, 100] (包含String和Integer)
Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐