反射的前提
1. 要获取类的对象(Class对象)
a. 抛异常:RefiectiveOperationException:反射的父异常,有了他不需要其他的
Class类的成员方法
获取字节码对象
1. static Class<?> forName(String className) :返回与带有给定字符串名的类或接口相关联的 Class 对象
a. 类名必须为全类名;例子:com.itheima_01.Student
b. 抛异常:ClassNotFoundException:给的类名可能找不到
c. 建议抛异常:ReflectiveOperationException 所有关于反射的异常
使用无参构造创建该class对象所表示的类的对象
2. T newInstance() :创建此 Class 对象所表示的类的一个新实例
a. 使用无参构造创建此字节码对象的实例
获取此字节码对象的构造方法对象
3. Constructor<?>[] getConstructors() :返回一个包含某些 Constructor 对象的数组,这些对象反映此 Class 对象所表示的类的所有公共构造方法。
a. 以数组形式返回字节码对象所有public修饰的构造方法
4. Constructor<T> getConstructor(Class<?>... parameterTypes) :返回一个 Constructor 对象,它反映此 Class 对象所表示的类的指定公共构造方法。
a. 根据指定参数返回此字节码对象的构造方法的对象
i. 可变参数不写参数类型的字节码对象返回的就是无参构造对象
ii. 可变参数写了参数类型的字节码对象返回的就是所写的对应参数类型的有参构造对象
Constructor<T>类
1. 构造方法对象
2. T :在其中声明构造方法的类
Constructor<T>类的成员方法
1. T newInstance(Object... initargs):使用此 Constructor 对象表示的构造方法来创建该构造方法的声明类的新实例,并用指定的初始化参数初始化该实例。
a. 根据Constructor对象所表示的构造方法创建其对象,并返回该对象
b. 如果此构造对象所表示的构造方法为无参的,调用方法时不用写initargs参数
c. 如果为有参的,initargs参数要和构造方法的参数类型相同
获取此字节码对象中的字段(成员变量)
1. Field getField(String name):返回一个 Field 对象,它反映此 Class 对象所表示的类或接口的指定公共成员字段。
2. Field getDeclaredField(String name): 返回一个 Field 对象,该对象反映此 Class 对象所表示的类或接口的指定已声明字段。
3. Field[] getFields(): 返回一个包含某些 Field 对象的数组,这些对象反映此 Class 对象所表示的类或接口的所有可访问公共字段。
a. 返回字节码对象所表示的类/接口所有public修饰的成员变量
4. Filed[] getDeclaredFields():返回 Field 对象的一个数组,这些对象反映此 Class 对象所表示的类或接口所声明的所有字段。
a. 返回字节码对象所表示的类/接口所有的成员变量
Fiel类
1. 表示字段的对象
Field类的成员方法
1. Object get(Object obj):返回指定对象上此 Field 表示的字段的值
2. void set(Object obj,Object value): 将指定对象变量上此 Field 对象表示的字段设置为指定的新值
3. void setAccessible(boolean flag) :将此对象的 accessible 标志设置为指示的布尔值
a. 设置反射时取消java的访问检查
获取字节码对象的成员方法
1. Method getMethod(String name,Class<?>... parameterTypes):返回一个 Method 对象,它反映此 Class 对象所表示的类或接口的指定公共成员方法。
a. name:方法名 parameterTypes:方法的参数类型的字节码对象
b. 方法无参parameterTypes就不写
Method类
1. 提供关于类或接口上单独某个方法(以及如何访问该方法)的信息的对象
Method类的成员方法
1. Object invoke(Object obj, Object... args) :对带有指定参数的指定对象调用由此 Method 对象表示的底层方法。
a. obj:调用该对象的method所指定的方法 args:方法中要传的参数
b. 返回的Object是方法的返回值,如果是void方法不用Object来接收