什么是 Java 反射机制
Java 反射机制允许程序在运行时查看任意对象所属的类,获取类的内部信息(包括构造器、字段和方法等),并能动态地调用对象的方法或构造器。它基于类的元数据进行操作,元数据描述了类的结构、属性和行为。
作用:
- 获取类信息:获取类的名称、包名、父类、实现的接口、构造器、字段和方法等。
- 创建对象:即便在编译时未知类的具体信息,运行时也能动态创建类的实例 。比如通过 Class 对象的 newInstance() 方法(前提是有无参构造函数 ),或获取构造器后调用其 newInstance() 方法创建实例。
- 调用方法:能调用类的方法,包括私有方法。
- 访问和修改属性:获取和修改类的字段值,包括私有字段 。
获取 Class 对象的方式有
.class 语法:如 String.class ,编译时已知类即可用。
getClass() 方法:对象实例调用,如 new String("").getClass() 。
Class.forName() 方法:传入类的全限定名加载类,如 Class.forName("java.util.Date") ,适合运行时动态加载类。
在项目中的应用场景
框架设计:像 Spring 框架,利用反射实现依赖注入,根据配置在运行时动态创建对象实例并注入依赖;还有动态代理实现 AOP 功能,如日志记录、事务管理等,通过反射在运行时创建代理类和对象,拦截并处理方法调用 。Hibernate 框架借助反射将数据库表映射到 Java 对象,实现 ORM 映射。
插件系统:开发插件式系统时,从配置文件或数据库读取插件类全名,用 Class.forName() 动态加载类,再创建实例并调用方法,实现插件功能的动态加载与使用,无需修改主程序代码即可扩展系统功能 。
单元测试:JUnit 等单元测试框架利用反射发现和调用标注了 @Test 注解的方法,自动执行测试,简化测试流程 。还能通过反射创建和配置测试对象,测试私有方法和字段。
序列化和反序列化:Jackson、Gson 等工具库在处理对象与 JSON、XML 等格式转换时,用反射读取对象属性值进行序列化,或根据数据格式利用反射创建对象并设置属性值完成反序列化 。