一句话先给答案反射 在程序运行时动态获取类的信息并动态操作对象的能力。正常编程类 → 对象 → 调用方法反射未知类 → 运行时拿到类结构 → 创建对象 / 调用方法 / 访问属性一、为什么需要反射先解决动机典型场景写一个框架不知道用户会传什么类配置文件 / 注解决定创建哪个类IDE 自动提示、调试工具、单元测试框架 没有反射框架无法通用。二、反射的三大核心能力能力说明获取 Class 对象类的“解剖图”操作构造器动态创建对象操作方法 / 字段调用方法、读写属性三、反射入门代码最常用示例1️⃣ 获取 Class 对象的三种方式java// 方式1类名.class Class? clazz1 User.class; // 方式2对象.getClass() User user new User(); Class? clazz2 user.getClass(); // 方式3Class.forName最常用在框架中 Class? clazz3 Class.forName(com.example.User);2️⃣ 通过反射创建对象javaClass? clazz Class.forName(com.example.User); Object obj clazz.getDeclaredConstructor().newInstance();3️⃣ 通过反射调用方法java// 获取方法 Method method clazz.getMethod(setName, String.class); // 调用 method.invoke(obj, 张三);4️⃣ 访问私有字段暴力反射javaField field clazz.getDeclaredField(age); field.setAccessible(true); // 突破 private field.set(obj, 18);四、反射的典型应用场景面试 / 实战✅Spring / MyBatis / JUnit根据配置文件或注解创建对象依赖注入DI✅注解处理器javaif (method.isAnnotationPresent(MyTest.class)) { method.invoke(instance); }✅通用 JSON 序列化工具✅开发通用框架 / 插件系统五、反射的代价重要问题说明性能略差比直接调用慢但大部分场景可接受破坏封装setAccessible(true)会访问私有成员代码可读性下降异常增多ClassNotFoundException等安全检查成本需要权限原则能用普通方式就不用反射。只有“写框架 / 工具”时才反射。
深入理解 Java 反射机制(Reflection)
发布时间:2026/5/22 16:14:28
一句话先给答案反射 在程序运行时动态获取类的信息并动态操作对象的能力。正常编程类 → 对象 → 调用方法反射未知类 → 运行时拿到类结构 → 创建对象 / 调用方法 / 访问属性一、为什么需要反射先解决动机典型场景写一个框架不知道用户会传什么类配置文件 / 注解决定创建哪个类IDE 自动提示、调试工具、单元测试框架 没有反射框架无法通用。二、反射的三大核心能力能力说明获取 Class 对象类的“解剖图”操作构造器动态创建对象操作方法 / 字段调用方法、读写属性三、反射入门代码最常用示例1️⃣ 获取 Class 对象的三种方式java// 方式1类名.class Class? clazz1 User.class; // 方式2对象.getClass() User user new User(); Class? clazz2 user.getClass(); // 方式3Class.forName最常用在框架中 Class? clazz3 Class.forName(com.example.User);2️⃣ 通过反射创建对象javaClass? clazz Class.forName(com.example.User); Object obj clazz.getDeclaredConstructor().newInstance();3️⃣ 通过反射调用方法java// 获取方法 Method method clazz.getMethod(setName, String.class); // 调用 method.invoke(obj, 张三);4️⃣ 访问私有字段暴力反射javaField field clazz.getDeclaredField(age); field.setAccessible(true); // 突破 private field.set(obj, 18);四、反射的典型应用场景面试 / 实战✅Spring / MyBatis / JUnit根据配置文件或注解创建对象依赖注入DI✅注解处理器javaif (method.isAnnotationPresent(MyTest.class)) { method.invoke(instance); }✅通用 JSON 序列化工具✅开发通用框架 / 插件系统五、反射的代价重要问题说明性能略差比直接调用慢但大部分场景可接受破坏封装setAccessible(true)会访问私有成员代码可读性下降异常增多ClassNotFoundException等安全检查成本需要权限原则能用普通方式就不用反射。只有“写框架 / 工具”时才反射。