Java反射概设
什么是反射
1、简介
反射是一种能力,能够自描述和自控制,即在运行状态中,动态获取类信息及动态调用实力方法的能力
2、Java反射的3个动态特性
- 运行时创建实例
- 运行期间调用方法
- 运行时更改属性
3、Java反射可以实现以下功能
-
运行时探知任意一个实例所属的类
-
运行时构造任意一个类的实例
-
运行时探知任意一个类所具有的方法和属性
-
运行时调用任意一个实例的方法
Java反射常用API
使用 Java反射技术,常用类如下
- java.lang.Class<T> 类
- 反射的核心类,反射所有的操作都是围绕该类来生成的。通过Class类可以获取类的属性,方法等内容信息
- java.lang.reflect.Constructor<T>类
- 表示类的构造方法
- java.lang.reflect.Filed类
- 表示类的属性,可以获取和设置类中的属性的值
- java.lang.reflect.Method类
- 表示类的方法,可以用来获取类中方法的信息和执行方法
反射的应用
1、反射的基本步骤
- 导入java.lang.reflect包中的相关类
- 获得需要操作的类的Class实例
- 调用Class实例的方法获取Field、Method等实例
- 使用反射API操作实例成员
2、获取类的信息
1、简介
一个类或接口被加载后,从系统中都能获得一个代表该类或接口的Class类型的实例,通过该实例就可以访问到Java虚拟机中的这个类或接口
2、获取Class实例(3种方式)
- 调用类或接口实例的getClass()方法
- getClass()方法是java.lang.Object类中的一个方法,所有类和接口的实例都可以调用该方法,该方法会返回该实例的所属类型所对应的Class实例
- 例如:通过入参或返回值得到的某个实例获取其类型信息
- Class cls = Obj.getClass(); //obj为某个类型的实例
- 例如:通过入参或返回值得到的某个实例获取其类型信息
- getClass()方法是java.lang.Object类中的一个方法,所有类和接口的实例都可以调用该方法,该方法会返回该实例的所属类型所对应的Class实例
- 调用类或接口的class属性
- 在某些类或接口没有实例或无法创建实例的情况下,可以通过其class属性获取所对应的Class实例,这种方式需要在编译期就知道类和接口的名称
- 例如:
- Class cls = Student.class; //Student为自定义的学生类型
- 例如:
- 在某些类或接口没有实例或无法创建实例的情况下,可以通过其class属性获取所对应的Class实例,这种方式需要在编译期就知道类和接口的名称
- 使用Class.forName()方法
- 若编码时无法确认具体类型,需要程序在运行时根据情况灵活加载,可以使用Class类的forName()方法。该方法是静态方法,需要传入字符串参数,该字符串参数的值是某个类的完全限定类名
- 例如:
- Class cls = Class.forName("com.mysql.cj.jdbc.Driver");
- 例如:
- 若编码时无法确认具体类型,需要程序在运行时根据情况灵活加载,可以使用Class类的forName()方法。该方法是静态方法,需要传入字符串参数,该字符串参数的值是某个类的完全限定类名
3、从Class实例获取信息
简介
在获得了某个类型对应的Class实例之后,就可以调用Class实例的方法来获得该类型的信息
获取对应类型基本信息的方法
-
获取类的基本信息
-
获取对应类型所含构造方法的方法
- 获取对应类型所含属性的方法
- 访问类包含方法的方法
3、创建实例
- 2种创建方式
- 使用Class实例的newInstance()方法创建相关类型的实例
- 示例:
- 示例:
- 使用Constructor实例创建相关类型的实例
- 步骤:
- 1.获取与该类型相关的Class实例
- 2.调用Class实例的方法获取表示指定构造方法的Constructor实例
- 3.调用Constructor实例的newInstance()方法来创建相关类型的实例
- 示例:
- 步骤:
- 使用Class实例的newInstance()方法创建相关类型的实例
4、访问类的属性
- 方法
- 如图
- 示例:通过反射访问Person类的name属性,实现取值和赋值
- 注意
- 上述示例没有用getField()方法来获取属性,因为getField()方法只能获取public访问权限的属性,而使用getDeclaredField()方法则可以获取所有访问权限的属性
- 如图
5、调用类的方法
简介
- Method类中包含一个invoke()方法,通过invoke()方法,Method实例可以调用Java类的实例方法和静态方法
- 如
- object invoke(Object obj , Object ... args)
- obj是执行该方法的对象,args是执行该方法时传入的参数
- 如