文章目录
- 反射
- 1.反射原理
- 1.1【成员变量类】-成员变量Field模板
- 1.2【成员方法类】-成员方法Method模板
- 1.3【构造方法类】-构造方法Constructor模板
- 2.Class类型
- 2.1概述
- 2.2Class类型对象【三种】获取方法
- 2.3案例代码
- 3.反射操作-实例化对象Constructor构造方法类型
- 3.1概述
- 3.2【三种】通过Class对象获取对应Constructor构造方法对象
- 3.3Constructor对象实例化对象操作
- 4.反射操作-Method【核心】
- 4.1概述
- 4.2通过 Class 对象获取对应的 Method 成员方法对象
- 4.3Method 成员方法对象执行对应方法操作
- 5.反射操作-FieId
- 5.1概述
- 5.2通过 Class 对象获取对应的 Field 成员变量对象
- 5.3Field 对象操作获取数据和赋值数据
- 6.暴力反射
反射
1.反射原理
- java中所有的类都是一个模板
- 对java而言,整个类也是一个类型,是一个Class类型的类
1.1【成员变量类】-成员变量Field模板
- 对于一个成员变量而言,变量名是唯一的。
- 需要额外注意当前成员变量所在哪个类
修饰符 数据类型 成员变量名称
1.2【成员方法类】-成员方法Method模板
- 对于一个成员方法而言,调用时我们只需要关注方法名和形参列表
- 需要额外注意当前成员方法所在哪个类
修饰符 返回值类型 方法名(形式参数列表);
1.3【构造方法类】-构造方法Constructor模板
- 对于一个构造方法而言,调用的唯一不同区别是形式参数列表
- 也需要额外注意当前构造方法所在哪个类
修饰符 类型(形式参数列表);
2.Class类型
2.1概述
- Class类型是java中所有类和接口的一种整体的模板的描述
- Class类型对应java类型在内存的方法区
class ClassName{ Field[] fields;//成员变量Field类型数组,成员变量个数不明确 Constructor[] constructors;//构造方法至少有一个,可能有多个 Method[] method;//成员方法个数也不明确,可能是一个多个或者没有 }
2.2Class类型对象【三种】获取方法
Class<?> class.forName(Sting 包名+类名);
- Class类型提供的静态成员方法,可以根据用户提供的完整包名.类名,获取对应数据类型的Class对象
功能
- 如果对应的类型已经在JVM中加载,直接获取
- 如果对应的类型尚未加载,先加载对应类型,再获取对应的Class对象
Class<? extends T> 任意类型对象.getClass();
- java中任意一个类对象,都可以跳过getClass方法获取对应的Class类型对象
- 方法由Object类提供给java中所有类型使用
Class<T> 类名.calss;
- 通过类名获取属性内容,得到对应的Class对象
2.3案例代码
无论通过哪种形式获取Class对象,只要是同一个类型,得到的就是同一个Class对象,指向内存方法区同一个数据空间
3.反射操作-实例化对象Constructor构造方法类型
3.1概述
对于Class对象,构造方法的名称不具备唯一性,实际调用中区分不同构造方法是通过不同的参数列表,参数数据类型,参数个数,参数顺序,来区分的
3.2【三种】通过Class对象获取对应Constructor构造方法对象
Constructor[] getConstructors();
获取当前Class对应数据类型的所有非私有化构造方法对象数组
Constructor[] getDeclaredConstructor();
【暴力反射】获取当前Class对应数据类型的所有构造方法对象数组,包括【私有化构造方法】
【核心方法】 Constructor getConstructor(Class...parameterTypes);
根据用户指定的参数类型、顺序、个数、获取对应的Constructor构造方法对象,并且是非私有化构造方法
代码案例
3.3Constructor对象实例化对象操作
通过3.4Constructor构造方法对象调用newInstance进行实例化对象操作。
当前newInstance方法所需参数是构造方法参数列表对应的实际参数,采用的参数形式为Object…,支持任意类型的不定长参数,或者空参。
示例
4.反射操作-Method【核心】
4.1概述
成员方法类型,通过Class对象获取,通过方法名和形参列表来确定方法
4.2通过 Class 对象获取对应的 Method 成员方法对象
Method[] getMethods();
- 获取Class对象对应类型的所有非私有化成员方法
- 包括父类继承给子类使用的成员方法
Method[] getDeclaredMethods();
- 【暴力反射】可以获取Class对象对应类型的所有成员方法
- 包括私有化成员方法
- 但不包括从父类继承来的成员方法。只有子类自身的方法
// 核心方法 ★ Method getMethod(String methodName, Class... parameterTypes);
- 根据指定的方法名称 (methodName) 和指定的方法参数类型,获取成员方法对象
- 只能是非私有化成员方法和父类继承给子类使用的方法。
4.3Method 成员方法对象执行对应方法操作
通过 Method 对象使用以下方法,执行对应方法运行目标
第一个参数 obj 执行当前方法的调用者,静态成员方法可以直接对应类实例化对象,或者 null
第二个参数是当前方法所需的实际参数列表,采用 Object 不定长参数形式,不限制任何的参数类型
【重点】
invoke 方法返回值类型为 Object 类型,支持当前目标方法的返回值,如果执行目标方法没有返回值,invoke 最终返回 null
5.反射操作-FieId
5.1概述
主要针对类内的成员变量,通过唯一的成员变量名确定
5.2通过 Class 对象获取对应的 Field 成员变量对象
Field[] getFields();
获取类内所有非私有化成员变量对象
Field[] getDeclaredFields(); // 重点方法 ★
【暴力反射】获取类内所有成员变量对象,包括私有化成员变量对象
Field getField(String fieldName);
根据指定的成员变量名称,获取对应的非私有化成员变量对象
5.3Field 对象操作获取数据和赋值数据
赋值操作方法
第一个参数 obj 是当前成员变量到底是哪一个类对象。
第二个参数 value 是给予当前成员变量的赋值的数据内容,考虑符合成员变量的数据类型
取值操作
第一个参数 obj 是当前成员变量到底是哪一个类对象。
返回值类型是当前成员变量存储的数据情况,统一返回 Object 类型,根据所需强转目标数据类型
6.暴力反射
对应方法
- 反射操作中 Constructor, Method ,Field 对象都可以调用该方法解决 私有化反射对象权限操作问题
- 参数为true为拥有操作权限,false为没有操作权限
AccessibleObject 类工具方法,所需参数是 AccessibleObject 数组和对应的权限标记,flag 通常为 true。
Field Method Constructor 都是 AccessibleObject 子类