454. Java 反射 - 简介

发布时间:2026/7/5 8:37:09
454. Java 反射 - 简介 文章目录454. Java 反射 - 简介1. 什么是 Reflection2. 核心 API 操作2.1 获取 Class 对象2.2 构造器、字段与方法3. Reflection 的常见用途 扩展性与插件系统 开发工具与 IDE 自动化测试与调试4. Reflection 的优缺点双刃剑✅ 优点❌ 缺点与风险5. 总结454. Java 反射 - 简介1. 什么是 ReflectionReflection反射允许 Java 程序在运行时Runtime检查或修改应用的行为。你可以把反射想象成一面镜子对象照镜子通过反射一个对象可以“看到”自己拥有哪些属性Field、方法Method和构造器Constructor。动态操作不仅能看你还可以通过镜子在运行时动态地改变字段值、调用方法甚至创建新的对象实例。2. 核心 API 操作反射的核心在于获取类的Class对象进而操作其内部结构。2.1 获取 Class 对象有三种常见方式获取一个类的Class对象// 1. 通过类字面量Class?clazz1String.class;// 2. 通过对象实例Class?clazz2Hello.getClass();// 3. 通过全限定类名常用于动态加载Class?clazz3Class.forName(java.lang.String);2.2 构造器、字段与方法以下是操作一个普通 Java 类如Person的常用 API操作对象核心方法示例代码构造器 (Constructor)getConstructor()ConstructorPerson c Person.class.getConstructor();Person p c.newInstance(); // 动态创建对象字段 (Field)getDeclaredFields()Field f Person.class.getDeclaredField(name);f.setAccessible(true); // 访问私有成员f.set(p, Alice); // 设置值方法 (Method)getMethods()Method m Person.class.getMethod(setAge, int.class);m.invoke(p, 25); // 动态调用方法3. Reflection 的常见用途 扩展性与插件系统反射允许根据类的全限定名动态加载用户自定义类。这在Spring 框架依赖注入和各类插件系统中极为常见开发者无需在代码中硬编码具体的类名。 开发工具与 IDEIDE如 IntelliJ 或 Eclipse的类浏览器、自动代码提示功能都是通过反射枚举类的字段、方法和接口来实现的。 自动化测试与调试JUnit自动发现并执行带有Test注解的方法。调试器在程序运行时检查对象的私有字段状态。4. Reflection 的优缺点双刃剑反射是一把功能强大的“双刃剑”在提供极致灵活性的同时也带来了风险。✅ 优点减少重复代码可以编写通用的逻辑来处理不同类的字段如通用的 ORM 框架。极高的灵活性支持在不重新编译的情况下改变程序的行为。突破封装限制可以访问和修改通常不可见的私有成员在特定调试场景下非常有用。❌ 缺点与风险 性能开销反射涉及动态解析JVM 无法对其进行深度优化调用速度明显慢于直接调用。避免在循环百万次的高频场景下使用。⚠ 内部暴露安全性反射通过setAccessible(true)打破了封装性。如果类内部字段名改变反射代码将直接崩溃导致代码难以维护且不可移植。 安全限制在受限环境如 Java 9 模块化系统或特定安全容器下反射操作可能会被禁止。5. 总结什么时候用开发框架Spring, MyBatis、编写工具软件、实现插件化功能、自动化测试。什么时候不用普通的业务逻辑开发。核心原则谨慎使用。如果可以通过多态或接口实现的功能优先不要使用反射。