getMethods方法

——返回的是一个方法的数组

通过类对象的getMethods()方法获取的结果

android 反射私有view 反射获取私有方法_私有方法

仔细观察发现:获取的方法全是public的,没有私有方法

而wait()、hashcode()、notify()方法则是继承来的

 

getDeclaredMethods()

——返回的是一个方法的数组

我们如果想获取私有方法,类对象还有一种方法getDeclaredMethods

android 反射私有view 反射获取私有方法_静态方法_02

仔细观察,获取了私有的方法,而且没有了继承来的方法了

 

invoke方法的调用

反射调用无参方法 eat()

android 反射私有view 反射获取私有方法_私有方法_03

我们正常调用方法使用的是 对象.方法名,所以我们可以通过类对象先获取对象,这里就是通过newInstance方法获取了bread对象。然后使用invoke方法,相当于  .  的作用

android 反射私有view 反射获取私有方法_android 反射私有view_04

运行:

android 反射私有view 反射获取私有方法_android 反射私有view_05

 

 

反射调用 toString()

android 反射私有view 反射获取私有方法_android 反射私有view_06

和上面的eat()类似,但是,上面不用写一个对象来接收,这里需要,因为toString()是有返回值的


android 反射私有view 反射获取私有方法_私有方法_07

执行结果

android 反射私有view 反射获取私有方法_类对象_08

 

 

调用带参的eat()

android 反射私有view 反射获取私有方法_静态方法_09

在getMethod方法里指定参数的类型

然后在invoke方法调用的时候将参数传入进去

android 反射私有view 反射获取私有方法_类对象_10

打印结果:

android 反射私有view 反射获取私有方法_静态方法_11

 

获取私有的方法

注意这里需要使用的方法不再是getMethod()而是要使用getDeclaredMethod()

android 反射私有view 反射获取私有方法_静态方法_12

然后运行:报错。因为私有的方法只能在本类中使用,所以我们要设置访问权限失效

android 反射私有view 反射获取私有方法_静态方法_13

privateMethod.setAccessible(true);

android 反射私有view 反射获取私有方法_android 反射私有view_14

 

运行测试:

android 反射私有view 反射获取私有方法_私有方法_15

 

获取静态方法

android 反射私有view 反射获取私有方法_静态方法_16

静态方法,先想一下我们正常是如何调用的,我们是使用类名.方法名,并没有使用到对象,所以我们可以这么写,省略获取对象的过程newInstance()

android 反射私有view 反射获取私有方法_类对象_17

android 反射私有view 反射获取私有方法_静态方法_18

 

再写一个 可以调用任何对象方法的通用方法

public  static Object invokeAny(Object obj,String methodName,Class<?>[] types,Object...args) throws Exception{
	
		//获取类对象
		Class<?> class1 = obj.getClass();
		//获取方法
		Method method = class1.getMethod(methodName, types);
		//调用
		return method.invoke(method, args);
	
	
	}

 

 

获取类的属性

android 反射私有view 反射获取私有方法_静态方法_19

我们使用getFields(),由于属性不是公开的,所以我们获取不到

android 反射私有view 反射获取私有方法_类对象_20

当我们使用getDeclaredFields(),可以获取私有的属性

android 反射私有view 反射获取私有方法_类对象_21

我们来获取单个属性的值,并设置,并取出来

正常我们要获取属性的值,调用的是对象.属性,所以在这里我们还是要先创建出对象newInstance()

android 反射私有view 反射获取私有方法_类对象_22

注意:当ID修改为private属性时

android 反射私有view 反射获取私有方法_类对象_23

调用时,我们还是要使用setAccessible(true);

android 反射私有view 反射获取私有方法_类对象_24