通过反射机制调用类对象中的方法
public static void main(String[] args) {
Hero h = new Hero();
try {
Method method = h.getClass().getMethod("setName", String.class); //这个是获取方法名,及其传入的参数类型。
System.out.println(method);
method.invoke(h,"猪头"); //invoke中,第一个参数是方法名,后面的参数是方法名中对应方法的参数列表
System.out.println(h.getName());
} catch (Exception e) {
e.printStackTrace();
}
}
public class Hero {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Hero(){
}
public Hero(String string) {
name =string;
}
@Override
public String toString() {
return "Hero [name=" + name + "]";
}
}
上面的代码是一个简单例子。需要注意的点是getMethod中的参数和invoke中的参数。
在上面例子中,setName的方法的参数是String name
public void setName(String name) {
this.name = name;
}
我们把它改成
public void setName(int i,String name) {
this.name = name;
}
那么main方法中改如何去修改,getMethod中的参数和invoke中的参数该填写什么?
首先是getMethod()中的参数,一开始是
Method method = h.getClass().getMethod("setName", String.class);
setName方法改成两个参数后
Method method = h.getClass().getMethod("setName", int.class,String.class);
这个意思就是对获取setName这个方法和它的参数列表的数据类型
我们可以明显的看到getMethod方法中的 XX.class 参数的意思是setName这个方法的参数列表中的对于的数据类型,有多少个就填入多少个,同时对于的数据类型要一致。
然后是method.invoke()中的参数 一开始是
method.invoke(h,"猪头");
setName方法改成两个参数后
method.invoke(h,111,"猪头");
//method.invoke(h,"猪头"); 如果setName改成两个后,还是这样只有“猪头”这个参数 则会报错
这个意思就是对方法中的参数赋值,需要invoke参数中得值的数据类型和getMethod中的类型一致,如果不一致或者缺少则会报错。