上篇说到了通过反射能够获取属性,使用 Field 对象,本篇简单说一下,通过反射如何获取方法以及调用方法:

想要获取方法,首先创建一个 Method 对象,有 getMethods 和 getMethod,同属性,getMethods 和 getDeclaredMethods 一个是拿到所有方法,一个是拿到本类(声明的)

Android反射获取所有继承指定接口的实现 反射获取method_字符串


输出结果对比:

getMethods:通过拿到了从父类 Object 里面继承的方法

Android反射获取所有继承指定接口的实现 反射获取method_传递参数_02


getDeclaredMethods:只能获取到当前类定义的方法

Android反射获取所有继承指定接口的实现 反射获取method_反射_03


获取到方法集合以后,说一下获取单个方法:

getMethod() 经过重载,如果不需要传递参数,例如 getter 方法,那么直接传递方法的 String 字符串即可

如果需要传递参数,比如 setter 方法,那么在后面需要传递参数的类,需要注意的是: 这里没有包装类的自动转换,必须对应,Integer.class 不能写成 int.class,反之亦然

Android反射获取所有继承指定接口的实现 反射获取method_字符串_04

已经拿到指定方法,现在开始执行方法:

使用 invoke 函数,执行方法,需要传递两个对象,第一个是需要执行方法的对象(这里是 student,第二个是需要传递的参数(如果没参数,直接传 null 即可)

Android反射获取所有继承指定接口的实现 反射获取method_传递参数_05

此时会出现一些问题:如果是私有方法(private 修饰的)那么就会报错,如图:

Android反射获取所有继承指定接口的实现 反射获取method_传递参数_06


因为此时是 getMethod,拿不到 私有的方法,需要使用 getDeclaredMethod 拿到已经声明的方法。

但是发现还是会报错

Android反射获取所有继承指定接口的实现 反射获取method_反射_07


这是因为没有设置权限访问,需要使用如下语句:

setAccessible,将参数修改为 true

Android反射获取所有继承指定接口的实现 反射获取method_反射_08


此时方法执行成功,总结:公共方法直接使用 getMethod 获取 invoke 执行,如果是 私有的方法 需要用 getDeclaredMethod 再设置 setAccessible 修改为 true 即可实行,此时完成反射的方法部分