1.什么是反射
反射是一种机制/功能,利用该机制/功能可以在程序运行过程中对类进行解剖并操作类中的构造方法,成员方法,成员变量(字段)。
2.获得Class的三种方式【重点】
- 对象.getClass()
- 使用Class类的forName(“类的全限定名”)最常见方式
- 使用类.class
3.反射原理分析图
4.获取Class对象的信息
创建对象(依赖无参构造) 【掌握】
T newInstance() ; 创建此 Class对象所表示的类的一个新实例。等价与new对象
在日后开发中,配置文件中会存放对应对象信息,利用反射返回对应对象
1.简单案例:
Student类中有共有有参构造方法,使用此方法进行反射出对象类型
Class students = Class.forName("Students");//确定类型
Constructor constructor = students.getConstructor(String.class, int.class);//确定构造
Object stu = constructor.newInstance("张三", 12);//实例化对象
System.out.println(stu);
2.Student类中有私有有参构造方法,使用此方法进行反射出对象类型,前提是需要暴力破解,否则会程序报错
Class students = Class.forName("Students");
Constructor constructor = students.getDeclaredConstructor(String.class,int.class);
constructor.setAccessible(true);//暴力破解
Object stu = constructor.newInstance("张三", 12);
System.out.println(stu);
5.构造方法的反射
关键字:Xxx代表Constructor
clazz.getXxxs(); //获得所有public类型构造方法
clazz.getDeclaredXxxs(); //获得所有声明的构造方法(含私有)
clazz.getXxx(类型...) //获得指定参数列表public类型构造方法
clazz.getDeclaredXxx(类型...) //获得指定参数列表声明的构造方法(含私有)
6.字段的反射
关键字:Xxx代表FieId
clazz.getXxxs() 所有public
clazz.getDeclaredXxxs() 所有声明(含私有)
clazz.getXxx(name) 获得指定名称public类型字段
clazz.getDeclaredXxx(name) 获得指定名称声明字段(含私有)
7.方法的反射【重要】
关键字:Xxx代表Method
clazz.getXxxs(); //获得所有的public类型方法 (含父类继承的)
clazz.getDeclaredXxxs() ; //获得所有声明方法(含私有)
clazz.getXxx(name , 类型...) ; //获得指定的public类型的方法
clazz.getDeclaredXxx(name , 类型..) //获得指定的声明的方法(含私有)
7.1 方法中的常用方法
Object invoke(Object obj, Object... args)
根据参数args调用对象obj的该成员方法
如果obj=null,则表示该方法是静态方法
案列分析:
1.上图中,调用一个参数的方法,并invoke方法执行。如果方法没有返回值,则返回null;
2.上图中,调用两个参数的方法,并invoke方法执行。如果方法没有返回值,则返回null;