前面介绍了如何利用反射技术读写私有属性,不单是私有属性,就连私有方法也能通过反射技术来调用。为了演示反射的逆天功能,首先给Chicken鸡类增加下列几个私有方法,简单起见弄来了set***/get***这样的基本方法:
private void setName(String name) { // 设置名称
this.name = name;
}
private String getName() { // 获取名称
return this.name;
}
private void setSex(int sex) { // 设置性别
this.sex = sex;
}
private int getSex() { // 获取性别
return this.sex;
}
参照私有属性的反射操作过程,私有方法的反射调用可分解为如下三个步骤:
1、调用Class对象的getDeclaredMethod方法,获取指定名称的方法对象,即Method对象;
2、调用Method对象的setAccessible方法,并传入true值,表示将该方法设置为允许访问,以解除private的限制;
3、调用Method对象的invoke方法,并传入鸡类实例,酌情填写输入参数;
虽然方法只有调用一说,没有读写之分,但是方法的输入参数可以有也可以没有,同样输出参数可以有也可以没有,因而对于方法对象而言,反射技术需要支持以下四种情况:有输入参数、无输入参数、有输出参数、无输出参数。注意到Chicken类的新增方法getName无输入参数、有输出参数,setName有输入参数、无输出参数,故而只要实现getName与setName两个方法的反射调用,刚好就覆盖了有无入参和有无出参这四种场景。