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);

    }

}

三、反射的适用场景

  1. 框架开发:Spring 的 IOC、AOP,ORM 框架的数据库映射,都大量使用反射;
  2. 动态代理:JDK 动态代理基于反射实现;
  3. 序列化 / 反序列化:JSON 框架(如 FastJSON、Jackson)用反射解析对象;
  4. 工具类开发:比如对象拷贝、耗时统计、日志增强等通用工具。

更多推荐