从 0 学 Java(22):反射的 3 个核心作用,新手也能懂的应用场景
·
从 0 学 Java(22):反射的 3 个核心作用与应用场景
一、反射基础概念
反射是 Java 在运行时动态获取类信息并操作类的能力。简单说就是让程序在运行时"看到"自己的结构,无需在编译期确定具体类。
二、3 个核心作用
-
运行时获取类信息
动态获取类名、字段、方法、注解等元数据Class<?> clazz = Class.forName("com.example.User"); Field[] fields = clazz.getDeclaredFields(); // 获取所有字段 -
运行时操作对象
动态创建对象、调用方法、修改字段值(包括私有成员)Object obj = clazz.newInstance(); // 创建对象 Method method = clazz.getMethod("setName", String.class); method.invoke(obj, "张三"); // 调用setName方法 -
运行时动态代理
创建接口的代理实现,实现 AOP 等高级功能InvocationHandler handler = (proxy, method, args) -> { System.out.println("方法执行前"); return method.invoke(target, args); }; UserService proxy = (UserService) Proxy.newProxyInstance(...);
三、新手易懂的应用场景
-
配置文件驱动开发
# config.properties className=com.example.PaymentService methodName=pay// 读取配置动态调用 Class<?> clazz = Class.forName(className); Method method = clazz.getMethod(methodName); method.invoke(clazz.newInstance()); -
通用序列化工具
// 自动将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; } -
简易测试框架
// 自动运行带@Test注解的方法 public static void runTests(Class<?> testClass) { for (Method method : testClass.getDeclaredMethods()) { if (method.isAnnotationPresent(Test.class)) { method.invoke(testClass.newInstance()); } } }
四、注意事项
- 反射会破坏封装性,谨慎操作私有成员
- 性能低于直接调用,高频场景需优化
- 编译期无法检查错误,需加强异常处理
新手建议:从读取类信息开始练习,再逐步尝试动态创建对象,最后实现简单配置文件解析器。反射是框架设计的基石,理解后能更好掌握 Spring 等主流框架。
更多推荐
所有评论(0)