一、概念:
允许程序在运行状态中,可以操作任意类中的属性和方法;并且可以操作任意对象内容的属性和方
法这种动态获取信息及动态操作对象属性和方法对应的机制称为反射机制。
二、类对象 和类的对象(实例)
(1) 类的对象:也称为实例,基于定义好的类创建的对象(new)
(2) 类对象:类加载的产物,封装了该类的相关信息(包名、类名、父类、接口、属性、构造方
法、成员方法等),由于一个类只进行一次类加载,所以一个类在jvm内存中最多只能有一个类对
象,但是可以有多个实例(类的对象)
三、获取类对象
(1) 通过实例获取类对象:
Student s= nde Student();//实例
Class c1= s.getClass();// 类对象
(2) 通过类名.class 获取类对象
Class c2 = Student.class;
(3) 通过 Class类中静态方法 forName获取类对象:
Class c3 = Class.forName("包名.类名");
注意:通过反射的技术获取类对象时,该类没有进行类加载,则jvm会先对类进行类加载
代码展示
结果展示
四、类加载的时机:
(1)第一次创建该类对象
(2)第一次访问该类静态成员
(3)子类类加载会导致其父类进行类加载
(4)通过反射技术获取类对象导致类进行类加载
五、常见的方法
(1)String getName():获取本类的类名,包名.类名
(2)通过类对象获取实例(类的对象):
// 1. 获取类对象
Class c = Class.forName("包名.类名");
// 2. 通过类对象获取实例
Object obj = c.newInstance();
注意:这种获取实例方式,默认调用类中无参数构造方法,所以在实际开发时,建议
Student、Worker等这样实体类提供有参数构造方法的同时提供无参数的构造方法
(3)其他方法代码展示
效果展示:
六、反射的优缺点
(1) 缺点:降低程序代码的可读性,操作相对麻烦
(2) 优点:提高程序代码的通用性和灵活性,通常应用在底层架构设计,例如框架或是工具类等。