一、获取Class类对象
static Class forName(String 完整的包名.类名);
根据指定的包名.类名获取对应的Class类对象,并且该方法可以加载指定类到当前程序中。
Class 类名.class;
通过类名获取当前类的Class对象,一般用于方法指定参数类型。
Class 类对象.getClass();
通过类对象获取当前类对象对应的Class类对象
二、获取Constructor类对象
构造方法:
1. 方法名一定是类名,强制要求
2. 构造方法之间的不同,有且只有参数不一样。
对于一个类而言,构造方法不同在于参数类型不同
1. 知道类型,参数类型不确定
2. 参数个数,参数个数也不确定
通过Class类对象获取Constructor类对象方法:
Constructor[] getConstructors();
通过Class类对象调用,获取当前Class对象对应的所有非私有化构造方法类对象数组。
Constructor[] getDeclaredConstructors();
通过Class类对象调用,获取当前Class对象对应的所有构造方法,包含私有化构造方法。【暴力反射】
Constructor getConstructor(Class… initArgumentTypes);
通过Class类对象调用,获取当前Class对象指定初始化形式参数列表数据类型方法。要求构造方法是非私有化方法。
Class… initArgumentTypes
这里需要使用Class类型来约束当前方法所需参数类型
… 不定长参数,参数个数不确定,但是必须是Class类型
Constructor getDeclaredConstructor(Class… initArgumentTypes);
通过Class类对象调用,获取当前Class对象指定初始化形式参数列表数据类型方法,可以获取私有化构造方法。【暴力反射】
Class… initArgumentTypes
这里需要使用Class类型来约束当前方法所需参数类型
… 不定长参数,参数个数不确定,但是必须是Class类型
通过Constructor类对象创建对应数据类型类对象:
Object newInstance(Object… initArugments);
该方法通过Constructor对象调用,实例化当前Constructor对应数据类型类对象。所需参数是当前Constructor类对象对应的初始化参数类型。
参数解释:
Object… initArugments
这里所需参数是Object类型,也就是任意数据类型,并且不限制参数个数,因为构造方法参数个数也是不一致的。
三、获取Method类对象
Method方法三要素
1. 返回值类型
2. 方法名
3. 形式参数列表
真正在调用一个方法过程中,核心考虑的模块
1. 方法名
2. 形式参数列表,方法参数类型,个数,顺序
通过Class类对象获取Method类对象方法:
Method[] getMethods();
获取当前Class类对象对应类,类内所有非私有化成员方法,包括从父类继承而来可以使用的成员方法。
Method[] getDeclaredMethods();
【暴力反射】获取当前Class类对象对应类,类内成员方法,包括私有化成员方法,但是不包括继承而来的方法。
Method getMethod(String methodName, Class… argumentTypes);
获取当前Class类对象对应类,类内指定方法名,和参数类型的非私有化成员方法。
String methodName 指定的方法名字
Class… argumentTypes 指定的方法对应的参数类型
Method getDeclaredMethod(String methodName, Class… argumentTypes);
【暴力反射】获取当前Class类对象对应类,类内指定方法名,和参数类型对应成员方法,包括私有化成员方法,但是不包含从父类继承而来的方法。
String methodName 指定的方法名字
Class… argumentTypes 指定的方法对应的参数类型
通过Method对象执行方法:
Object invoke(Object obj, Object… arguments);
参数解释:
obj: 执行当前方法的类对象
Object… arguments: 执行当前方法所需的实际参数,要求和方法参数列表一致
四、获取Field类对象
Field成员变量类,操作过程中所需考虑的内容
就是当前成员变量的名字
通过Class类对象获取Field类对象方法:
Field[] getFields();
获取所有非私有化成员变量数组
Field[] getDeclaredFields();
获取所有成员变量数组,包括私有化成员变量
Field getField(String name);
获取指定名字的非私有化成员变量对象
Field getDeclaredField(String name);
获取指定名字的成员变量对象,包括私有化成员变量
通过Field类对象操作成员变量:
void set(Object obj, Object value);
通过Field类对象调用,设置指定obj对象中的成员变量,赋值value
obj: 哪一个对象的成员变量
value: 对应当前成员变量的赋值数据
Object get(Object obj);
通过Field类对象调用,获取指定obj对象中的成员变量数据
obj: 指定哪一个类对象
给予暴力反射操作权限:
void setAccessible(boolean flag);