反射:框架的设计灵魂
java代码在计算机中的三个阶段:
- 编写到的源代码,一个个的java文件和对象
- 经过ClassLoadeer类加载器的加载将一个类对象分为三个组成部分
- 成员变量 Field[] fields
- 构造方法 Constructor[] cons
- 成员方法 Method[] method
- 在完成类加载之后实际创建对象并运行
反射
- 获取对象
- Class clazz = ClassName.class;
- 从获取到的对象进行不同的操作
- 获取成员变量的操作:
Field[] getFields(); //获取所有的Public修饰的成员变量
Field getField(Strign name); //获取指定名称的public修饰的成员变量
Field getDeclaredFields(); //忽略修饰符的去获取所有的成员变量,但仍不能够对非public变量进行操作
Field getDeclaredField(String name); //指定变量名获取
得到变量的值后可以使用get,set方法进行获取值和设定值的操作。
- 获取构造方法的操作:
Constructor<T> getConstructor(类<?>... parameterTypes); //通过传入不同的参数获取到不同的构造方法
Object O = ClassName.newInstance(); //直接调用空构造方法是考研直接对获取到的对象操作,以简化操作
获得构造方法之后可以通过newInstance()方法创建一个新的对象。
getDeclaredConstructor方法同上成员变量
- 获取成员方法的操作:
Method mNmae = ClassName.getMethod();
mNmae.invoke(Object object,参数);// 使用invoke方法对获取到的方法进行运行,需要向方法中传入一个对象,若有参则传入对应的参数
在获取所有方法时,会同时获取到其继承自父类的方法,无继承则自动继承Object类
在获取方法后,运用其方法进行操作
- 获取类名:
String getName();//获取方法名也可行
- 忽略修饰符权限进行操作,暴力反射
-
若获取到的变量方法是非public的,则只能得到其名称,而不能对其进行get,set操作
-
使用setAccessible(true); //暴力反射,