什么是反射?
反射是java的一种高级特性,在"运行期间"对ava的类型信息进行检查、操作处理。
例如:加载JDBC驱动类,Mybatis动态处理ResuleType,Spring根据配置信息创建Bean对象等。
反射的常见操作
1.获取Class类型信息
2.执行构造方法创建对象
3.调用实例方法
4.通过成员变量保存值和获取值
反射中的常见类
Class类:
作用:用于保存一个类的类型信息,它是反射的入口操作
获取Class对象的三种方式
//1.通过类名
Class bookClass1 = Book.class; //类名.class
//2.通过forName()方法
Class bookClass2 = Class.forName("day03.Book"); //类名的位置
//3.通过对象
Class bookClass3 = new Book().getClass();
Constructor类:
作用:代表一个类中的构造方法(构造器),用于创建目标对象
获取Constructor构造方法的方式
Class cls = Class.forName("day03.Book");
//获取无参构造方法
//Class对象.getConstructor()
Constructor constructor1 = cls.getConstructor();
//获取有参构造方法
//Class对象.getConstructor(Class...)
Constructor constructor2 = cls.getConstructor(String.class,String.class,double.class,int.class);
//Book类中的有参构造
public Book(String bookName, String author, double price, int stock) {
super();
this.bookName = bookName;
this.author = author;
this.price = price;
this.stock = stock;
}
执行Constructor构造方法的方式
//执行无参构造方法
//Constructor对象.newInstance()
Object obj2 = constructor1.newInstance();
//执行有参构造方法
//Constructor对象.newInstance(值...)
Object obj3 = constructor2.newInstance("活着","余华",22.2,100);
Field类:
作用:代表一个类中的成员变量(字段),用于为目标对象保存值和获取值
获取Field成员变量的方式
//获取所有成员变量
//public修饰的成员变量
//Class对象.getFields()
Field[] fields = cls.getFields();
//public\private修饰的成员变量
//Class对象.getDeclaredFields()
Field[] fields = cls.getDeclaredFields();
//获取指定成员变量
//public修饰的成员变量
//Class对象.getField(成员变量名称)
Field field = cls.getField("version");
//public\private修饰的成员变量
//Class对象.getDeclaredField(成员变量名称)
Field field = cls.getField("bookName");
//Book类中的属性
private String bookName;
private String author;
private double price;
private int stock;
public int version;
Method类:
作用:代表一个类中的方法,用于调用执行该方法
获取Method方法的方式
//Class对象.getMethod()
Method method = cls.getMethod(methodName,String.class); //第二个参数为被获取的方法的参数
//Class对象.getMethods()
Method[] methods = cls.getMethods();
//被获取方法的类
public class Task {
public String execute(String id) {
System.out.println("执行流水号:" + id);
System.out.println("执行了Task任务类的execute方法!!!");
return "ok";
}
}