在反射中,我们需要得到的是构造方法、成员方法、成员变量
得到这些的前提是得到.class文件的类对象
1.Class
1.Class类的静态成员方法,通过完整的包名.类名获取对应.class文件的Class对象
Class Class.forName(String packageNameAndClassName);
2.通过类名.class方法,获取对应的Class类对象,通常用于方法的参数类型
Class 类名.class;
3.通过类对象获取对应.class的Class类对象,方法参数,或者说数据类型判断
Class 类对象.getClass();
2.Constructor
1.获取当前Class类对象对应Java文件中,所有【public修饰构造方法的类对象数组】
public Constructor[] getConstructors();
2.获取当前Class类对象对应Java文件中,所有【构造方法的类对象数组】,包括私有化构造方法。
public Constructor[] getDeclaredConstructors();
3.根据指定的数据类型,来选择对应的构造方法,这里有且只能获取获取类内的指定数据类型public修饰构造方法类对象
public Constructor getConstructor(Class...initArgumentTypes);
4.根据指定的数据类型,来选择对应的构造方法,这里可能会抛出异常。这里可以获取指定参数类型私有化构造方法和非私有化构造方法
public ConstructorgetDeclaredConstructor(Class...initArgumentTypes);
5.通过Constructor对象来调用,传入当前构造方法所需创建对象的初始化参数,创建对象
Object newInstance(Object... initArguments);
6.给予通过暴力反射得到的非公开权限成员变量、成员方法、构造方法操作权限
setAccessible(boolean flag);
2.Method
1.获取类内所有public修饰的成员方法,包括从父类继承而来的public修饰方法
Method[] getMethods();
2.获取类内所有成员方法,但是不包括从父类继承而来的方法
Method[] getDeclaredMethods();
3.根据指定的方法名和对应的参数类型,获取对应的public修饰的成员方法,包括从父类继承得来的
Method getMethod(String methodName, Class...parameterTypes);
4.根据指定的方法名和对应的参数类型,获取对应的成员方法,包括私有化成员方法,但是不包括从父类继承而来的方法
Method getDeclaredMethod(String methodName, Class... parameterTypes);
5.通过Method类对象调用,执行对应的方法,需要的参数
Object invoke(Object obj, Object... arguments);
3.Field
1.获取类内所有public修饰的成员变量
Field[] getFields();
2.获取类内所有成员变量,包括私有化成员方法
Field[] getDeclaredFields();
3.获取指定变量名的成员变量对象,要求是public修饰的成员变量
Field getField(String fieldName);
4.获取指定变量名的成员变量对象,包括private私有化修饰的成员变量
Field getDeclaredField(String fieldName);
5.设置指定调用者中对应成员变量的数据
void set(Object obj, Object value);
6.获取指定调用者中指定成员变量的数据
Object get(Object obj);
总结
1.方法看似多,记起来很有规律,Constructor、Method、Field获取全部和获取指定共6个,暴力反射获取在这些方法基础上加上Declared,又是6个;
2.成员变量和成员方法在使用时需要提供使用者,因为每个对象都不一样;
3.暴力反射获取的如果要使用就调用setAccessible方法赋值true;
4.很多方法使用时都会抛出异常,都是找不到指定内容、参数类型不匹配等。