从 0 学 Java(22):反射的 3 个核心作用与应用场景

一、反射基础概念

反射是 Java 在运行时动态获取类信息并操作类的能力。简单说就是让程序在运行时"看到"自己的结构,无需在编译期确定具体类。


二、3 个核心作用
  1. 运行时获取类信息
    动态获取类名、字段、方法、注解等元数据

    Class<?> clazz = Class.forName("com.example.User");
    Field[] fields = clazz.getDeclaredFields(); // 获取所有字段
    

  2. 运行时操作对象
    动态创建对象、调用方法、修改字段值(包括私有成员)

    Object obj = clazz.newInstance(); // 创建对象
    Method method = clazz.getMethod("setName", String.class);
    method.invoke(obj, "张三"); // 调用setName方法
    

  3. 运行时动态代理
    创建接口的代理实现,实现 AOP 等高级功能

    InvocationHandler handler = (proxy, method, args) -> {
        System.out.println("方法执行前");
        return method.invoke(target, args);
    };
    UserService proxy = (UserService) Proxy.newProxyInstance(...);
    


三、新手易懂的应用场景
  1. 配置文件驱动开发

    # config.properties
    className=com.example.PaymentService
    methodName=pay
    

    // 读取配置动态调用
    Class<?> clazz = Class.forName(className);
    Method method = clazz.getMethod(methodName);
    method.invoke(clazz.newInstance());
    

  2. 通用序列化工具

    // 自动将Map转为对象
    public static <T> T mapToObject(Map<String, Object> map, Class<T> clazz) {
        T obj = clazz.newInstance();
        for (Field field : clazz.getDeclaredFields()) {
            field.setAccessible(true);
            field.set(obj, map.get(field.getName()));
        }
        return obj;
    }
    

  3. 简易测试框架

    // 自动运行带@Test注解的方法
    public static void runTests(Class<?> testClass) {
        for (Method method : testClass.getDeclaredMethods()) {
            if (method.isAnnotationPresent(Test.class)) {
                method.invoke(testClass.newInstance());
            }
        }
    }
    


四、注意事项
  1. 反射会破坏封装性,谨慎操作私有成员
  2. 性能低于直接调用,高频场景需优化
  3. 编译期无法检查错误,需加强异常处理

新手建议:从读取类信息开始练习,再逐步尝试动态创建对象,最后实现简单配置文件解析器。反射是框架设计的基石,理解后能更好掌握 Spring 等主流框架。

Logo

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

更多推荐