三、操作Method成员方法类
1、通过class类对象获取对应的Method成员方法类对象
1.1 通过class类对象获取当前类内所有非私有化成员方法(包含从父类继承而来且子类可以使用的非私有化方法)
Method[] getMethods();
//1、获取当前类内所有非私有化成员方法,包含父类继承过来的非私有化方法
Method[] methods = cls.getMethods();
for (Method method : methods) {
System.out.println(method);
}
1.2 暴力获取当前类对象所有成员方法(包含私有化)但是不包括从父类继承而来的方法。
Method[] getDeclaredMethods();
//2、获取当前类所有成员方法,但是不包含父类继承给子类的方法
Method[] declaredMethods = cls.getDeclaredMethods();
for (Method method : declaredMethods) {
System.out.println(method);
}
1.3 根据方法名称和数据类型获取对应的成员方法,可以获取父类继承的方法,但是不能获取私有化成员方法。
Method getMethod(String methodName, Class... paramterTypes);
//3、根据指定方法名字和参数类型,获取非私有化成员方法:
Method game1 = cls.getMethod("game");
Method game2 = cls.getMethod("game", String.class);
System.out.println(game1);
System.out.println(game2);
1.4 根据指定的方法名和参数类型,暴力获取成员方法(包含私有化,不能获取父类成员方法)
Method getDeclaredMethod(String methmodName, Class... parameterTypes);
例如:
//4、根据指定的名字和参数类型,暴力获取私有成员方法
Method testPrivate1 = cls.getDeclaredMethod("testPrivate");
Method testPrivate2 = cls.getDeclaredMethod("testPrivate", String.class);
System.out.println(testPrivate1);
System.out.println(testPrivate2);
四、操作Field成员变量类:
1、通过Class类对象获取对应类的Field成员变量类对象:
1.1 获取类内所有非私有化成员变量数组
Field[] getFields();
例:
//1、获取类内所有的非私有化成员变量数组
Field[] fields = cls.getFields();
for (Field field : fields) {
System.out.println(field);
}
1.2 暴力获取所有的成员变量数组(包含私有化)
Field[] getDeclaredFields();
例:
//2、获取类内所有的成员变量数组(包含私有化)
Field[] fields1 = cls.getDeclaredFields();
for (Field field : fields1) {
System.out.println(field);
}
1.3 根据成员变量名字获取对应的变量(非私有化)
Field getField(String fieldName);
例:
//3、根据成员变量名字获取对应的成员变量(非私有化)
Field test = cls.getField("test");
System.out.println(test);
1.4 根据成员变量名字,暴力获取对应变量(私有化)
Field getDeclaredField(String fieldName);
例:
//4、根据成员变量名字,暴力获取对应变量(私有化)
Field name = cls.getDeclaredField("name");
System.out.println(name);
2、操作Field类对象赋值取值成员变量
2.1 赋值Field类对象对应成员比那辆
void set(Object obj, Object value);
Object obj:明确当前赋值的成员变量时哪一个类对象的。
Person p = new Person();
old:p.setName(“小明”);
now:name.set(p,“小明”);
2.2 取值Field类对象对应的成员变量
Object obj 明确获取的成员变量归属于哪一个类。
Object get(Object obj);
Person p = new Person();
old: p.getName();
now: name.get§;
Object obj = cls.getConstructor().newInstance();
System.out.println(obj);
test.set(obj, 666);
System.out.println(obj);
System.out.println(test.get(obj));
五、暴力反射授权
一般情况下,我们不能对类的私有字段进行操作,所以在处理这些字段时候,我们就要调用AccessibleObject上的setAccessible()方法来允许这种访问,由于反射类中的Field,Method和Constructor都继承AccessibleObject ,所以通过这些类来调用setAccessible()方法,可以实现对这些字段的操作。
子类对象包括:Field Method Constructor
1、通过类名调用形态工具方式,基于AccessibleObject类对象或者其子类对象数组,赋值操作权限。
public static void setAccessible(AccessibleObject[] array, boolean flah);
2、通过AccessibleObject类对象调用,单一授权。
public void setAccessible(boolean flag);
//获取特定的声明了的方法
Method judgeMethod = emClass.getDeclaredMethod("judge", new Class[]{Integer.TYPE});
//setAccessible(boolean flag)使所有成员可以访问,访问之前设置
judgeMethod.setAccessible(true);
//获取所有声明的方法
Method[] allMethods = emClass.getDeclaredMethods();
//AccessibleObject.setAccessible(AccessibleObject[] array,
boolean flag)批量给访问权限
AccessibleObject.setAccessible(allMethods, true);
//下面就可以通过反射访问了
judgeMethod.invoke(em, new Object[]{3});