反射
为什么使用反射
需求:我公司定义了一组接口,然后第三方公司按照我公司的接口 实现了一套功能,然后交给我们,但是我们公司的项目已经结束,如何实现动态加载第三方公司提供的功能。
什么是反射
反射就是把 Java 类中的各种成分映射成一个个的 Java 对象。例如,一个类有:成员变量,方法,构造方法,包等等信息,利用反射技术可以对一个类进行解剖,把各个组成部分映射成一个个对象。
反射常用类
- Class 类 - 可获取类和类的成员信息
- Fileld类 - 可访问类的属性
- Method类 - 可调用类的方法
- Constructor类 - 可调用类的构造方法
使用反射的基本步骤
- 导入 java.lang.reflect.*;
- 获得需要操作的类的 java.lang.Class 对象
- 调用 Class 的方法获取 Field、Method 等对象
- 使用反射 API 进行操作(设置属性、调用方法)
Class 类
Class 类是反射机制的起源和入口
- 每个类都有自己的 Class 对象
- 用于获取与类相关的各种信息
- 提供了获取类信息的相关信息
- Class 类继承自 Object 类
Class 类存放的接口信息
- 类名
- 父类、接口
- 方法、构造方法、属性
- 注释
获取 Class 对象的方法
第一种方式
// 方法 1 :对象.getClass()
Student stu = new Student();
Class clazz = stu.getClass();
第二种方式
// 方法 2 :类.class
clazz = Student.class;
clazz = String.class;
第三种方式
// 方法 3 :Class.forName()
clazz = Class.forName("java.lang.string");
clazz = Class.forName("java.util.Date");
获取类的其他结构信息
Class clazz = Class.forName("java.lang.object");
Field fields[] = clazz.getDeclaredFields(); // 获取 Field 对象
Method methods[] = clazz.getDeclaredMethod(); // 获取 Method 对象
Constructor constructors[] = clazz.getDeclaredConstrutors(); // 获取 Constructor 对象
动态创建对象
方法一 :使用 Class 的 newInstance() 方法,仅适用无参构造方法
Class clazz = Class.forName("com.yyh.pojo.Student");
Object object = clazz.newInstance();
方法二:调用 Constructor 的 newInstance() 方法,适用所有构造方法
Constructor cons = clazz.getConstructor(new Class[]{String.class, Integer.class, Float.class});
Object obj = cons.newInstance(new Object[] {"lkl", 32, 56, 5f});
反射技术的优点和缺点
优点:
- 提高了 Java 程序的灵活性和扩展性,降低了耦合性,提高自适应能力
- 允许程序创建和控制任何类的对象,无需提前硬编码目标类
缺点:
- 性能问题
- 代码维护问题