一、什么是
首先我们要知道反射是干啥的,反射是获取一个运行时状态,为什么我们要获取运行时状态呢?我们要获取运行时状态获取对象,创建对象后用其构造方法,成员方法。
其次,在反射中,我们常用到的方法Class.forname方法获取class对象,通过getConstructor,getFiled,getMethod获取对象的构造方法,成员方法,成员变量。
最后,通过反射,我们可以更好看别人的代码和底层代码。
二、核心类
- Class类:表示正在运行的Java应用程序中类或接口。
- Method类:表示类的方法对象。可以通过反射调用一个类的具体方法。
- Field类:表示成员变量。通过反射,可以获取类的属性,并对属性进行读写操作。
- Constructor类:表示类的构造方法。通过反射,可以调用一个类的构造方法,实例化该类。
三、用途
- 动态加载类:在运行时加载类,不需要在编译时确定。
- 访问类的成员:在运行时访问类的字段、方法、构造器。
- 调用方法:在运行时调用对象的方法。
- 创建实例:在运行时创建类的实例。
四、获取Class对象方式
- Class class = MyClass.class;
- Class class = myObject.getClass();
- Class class = Class.forName();
五、访问类的成员的常用方法
- 获取构造器
Constructor<?> constructor = class.getConstructor(String.class);
Object obj = constructor.newInstance("Hello");
- 获取字段
Field field = class.getDeclaredField("name");
field.setAccessible(true);
field.set(obj, "World");
- 获取方法
Method method = class.getMethod("sayHello");
method.invoke(obj);
六、优缺点
1.优点
- 降低耦合性
- 简化代码
- 支持框架和插件开发
2.缺点
- 可读性降低
- 增加开销,降低性能
- 破坏封装性
七、 应用场景
1.框架开发
(1)依赖注入
- Spring框架:Spring 使用反射来实现依赖注入。通过反射,Spring 可以在运行时动态地创建和管理 Bean,并将依赖项注入到这些 Bean 中。
(2)对象关系映射
- MyBatis:Mybatis使用反射来动态地构建 SQL 语句,并将结果映射到 Java 对象。
2.动态代理
- Spring AOP:Spring AOP 使用动态代理来实现切面编程。通过反射,可以在不修改原有代码的情况下,添加横切关注点(如日志记录、事务管理等)。
3.测试框架
- JUnit 使用反射来发现和运行测试方法。通过反射,JUnit 可以自动检测带有
@Test
注解的方法,并执行这些方法。
4.序列化和反序列化
(1)JSON库
- Gson:Gson 使用反射来将 Java 对象转换为 JSON 字符串,以及将 JSON 字符串转换为 Java 对象。
(2) XML库
- JAXB:JAXB 使用反射来将 Java 对象转换为 XML 文档,以及将 XML 文档转换为 Java 对象。
5.动态配置
- Spring Boot:Spring Boot 使用反射来解析配置文件(如
application.properties
或application.yml
),并将配置值注入到 Bean 中。
6.类加载器
- 自定义类加载器:通过反射,可以实现自定义类加载器,动态加载类。