2026-10-25 22:21:40
Java反射机制允许程序在运行时动态获取类的信息并操作类或对象,无需在编译时确定具体类型。反射的核心是通过Class类、Method类、Field类等API实现动态加载类、调用方法、访问属性等功能。
一、反射的核心概念动态性反射允许程序在运行时获取类的完整结构(如方法、属性、构造函数等),并动态调用方法或修改属性。例如:
Class<?> clazz = Class.forName("com.example.Test");Method method = clazz.getMethod("sayHello");method.invoke(clazz.newInstance());与常规代码的对比
常规方式:需在编译时明确类名和方法(硬编码)。
反射方式:通过字符串动态指定类名和方法名(如从配置文件读取)。
动态调用方法根据用户输入或配置文件动态选择方法调用。例如:
BufferedReader br = new BufferedReader(new FileReader("config.txt"));String methodName = br.readLine(); // 从文件读取方法名Method method = Test.class.getMethod(methodName);method.invoke(obj);动态加载类与属性通过Class.forName()和Field类实现运行时类替换。例如:
Field field = Test.class.getDeclaredField("sorter");field.set(obj, Class.forName("com.example.BubbleSorter").newInstance());框架底层支持
Spring依赖注入:通过反射实例化Bean并注入属性。
动态代理:如Spring AOP在运行时生成代理类。
RPC框架:序列化/反序列化时通过反射调用远程方法。
配置化驱动行为将类名、方法名、参数类型存储在配置文件中,程序运行时读取并动态调用。例如:
# config.txtmethodName=sayHello统一日志/监控在方法调用前后插入日志(如通过Method.invoke()拦截)。
插件化架构动态加载外部JAR包中的类,实现热插拔功能。
基础示例
public class TestReflection { public static void main(String[] args) throws Exception { Test obj = Test.class.newInstance(); BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String methodName = br.readLine(); // 输入"sayHello"或"sayWorld" Method method = Test.class.getMethod(methodName); method.invoke(obj); // 动态调用方法 }}关键点:通过字符串methodName决定调用哪个方法。
动态属性赋值
Field field = Test.class.getDeclaredField("sorter");field.setAccessible(true); // 允许访问私有属性field.set(obj, new BubbleSorter()); // 动态注入实现类优点
灵活性高,适合框架设计。
减少硬编码,便于扩展。
缺点
性能开销:反射调用比直接调用慢(需动态解析)。
安全性:可能破坏封装性(如访问私有成员)。
复杂性:代码可读性较差,需处理大量异常(如ClassNotFoundException)。
文件驱动反射将输入源从控制台改为文件(如config.txt),通过修改文件内容改变程序行为,无需重新编译。
Spring依赖注入原理Spring通过反射读取Bean配置(如XML或注解),动态实例化对象并注入依赖。例如:
// 伪代码:Spring容器初始化BeanClass<?> beanClass = Class.forName("com.example.UserService");Object bean = beanClass.newInstance();Field dependencyField = beanClass.getDeclaredField("userRepository");dependencyField.set(bean, getBean("userRepository")); // 注入依赖反射是Java动态性的核心机制,虽不推荐在业务代码中频繁使用,但在框架开发中不可或缺。理解反射后,可更深入掌握Spring、Hibernate等框架的设计原理。