反射入门
1.反射(上帝视角)
1.获取反射对象的三种方法
1.通过对象
ClassObj classobj = new ClassObj();
Classs clz = classobj.getClass();
2.通过字面值常量
Class classObjClasss = Classobj.class
3.通过静态方法
Class classObj = Class.forName(className)
2.获取构造方法
//只能获取给类中定义的所有公共(public)的构造方法
Constructor<?>[] getConstructors()
//可以获取到,该类中定义的所有的构造方法
Constructor<?>[] getDeclaredConstructors()
获取指定构造方法
// 只能获取类定义中,单个指定的public的构造方法
// Class... parameterTypes, 表示要获取的,那个构造方法的,参数列表,这个参数列表中的,都是对象数据类型的,字面值常量
Constructor getConstructor(Class... parameterTypes)
// 只能获取类定义中,单个指定的任意访问权限的构造方法
Constructor getDeclaredConstructor(Class... parameterTypes)
Constructor
newInstance(Object... initargs) Object... initargs创建对象时的初始化值
使用此 Constructor 对象表示的构造方法来创建该构造方法的声明类的新实例,并用指定的初始化参数初始化该实例。
可变参数,int...
代表可变参数,可以代表一个,多个,甚至没有。参数传递也一样。但是可变参数必须位于参数列表最后一个,且一个方法只能定义一个可变参数。
3.获取成员变量
// 可以获取当前类中所定义的所有的公有成员变量,以及当前类的所有父类中所定义的公共成员变量
Field[] getFields()
// 可以获取 当前类 中定义的所有成员,但是该方法无法获取到父类中定义的成员变量
Field[] getDeclaredFields()
获取指定成员变量
// 可以获取到指定名称的 公共 成员变量
// a. 子类中找指定名称的成员变量
// b. 如果子类中没有,在到父类中去找,如果父类中没有,则会层层向上递归,在其祖先类中查找,
在此过程中,如果一旦找到了就会停止该查找过程,否则,会一直到最顶层祖先类,如果仍然没有找到,
此时抛出异常 NoSuchFieldException
Field getField(String name)
// 只能获取 当前类中定义的,指定任意指定名称的的成员
Field getDeclaredField(String name)
通过Field读写对象的成员变量(可暴力破解)
// 在指定对象上,获取该成员变量的值
// Objecgt obj , 指的就是要获取值的那个对象
Object get(Object obj)
Field对象.get(对象)
//可以设置指定对象的,该成员变量的值
// Object obj 指的就是要设置成员变量值的对象
// Object value 要设置的新值
void set(Object obj, Object value)
Field对象.set(Object obj, Object value)
4.获取成员方法
// 获取当前类以及子类中的公共方法
Method[] getMethods()
// 当前类中,所定义的所有方法
Method[] getDeclaredMethods()
获取指定的成员方法
// 获取当前类或其祖先类中定义的公共方法
// String name 是指我们要获取的方法的方法的名称
// Class... parameterTypes 指方法的参数列表
// 确定一个方法 方法名+方法的参数列表 = 方法签名
// getMethod方法如果获取指定的方呢?
a. 首先在子类,定义中查找指定的方法
b. 如果子类中没有,递归在其祖先类查找,如果一旦查找到,就停止查找过程,否则
会一直向上递归,知道最上层根类,如果都没有,NoSuchMethodException
Method getMethod(String name, Class... parameterTypes)
// 获取当前类中定义的所有方法
Method getDeclaredMethod(String name, Class<?>... parameterTypes)
利用Method调用对象的方法
Object invoke(Object obj, Object... args)
利用Method调用对象的方法
// obj 要调用方法的那个对象
// Object... 方法调用是,传递的实际参数
Object invoke(Object obj, Object... args)
Method对象.invoke(obj, ars);