通过反射调用方法
当获得某个类对应的Class对象后,就可以通过Class对象的getMethods()方法或getMethod()方法获取全部方法或者指定方法,getMethod()方法和getMethods()这两个方法的返回值,分别是Method对象和Method对象数组。每个Method对象都对应一个方法,程序可以通过获取Method对象来调用对应的方法。在Method里包含一个invoke()方法,该方法的定义具体如下:
public Object invoke(Object obj, Object... args)
在上述方法定义中,参数obj是该方法最主要的参数,它后面的参数args是一个相当于数组的可变参数,用来接收传入的实参。
为了帮助大家更好地学习如何通过反射调用方法,接下来通过一个案例来演示,如例1所示。
例1 ReflectDemo04.java
1 package cn.itcast.chapter08.reflection;
2 import java.lang.reflect.Method;
3 class Person {
4 private String name; //定义属性name,表示姓名
5 private int age; //定义属性age,表示年龄
6 public String getName() {
7 return name;
8 }
9 public void setName(String name) { //设置name属性
10 this.name = name;
11 }
12 public int getAge() {
13 return age;
14 }
15 public void setAge(int age) { //设置age属性
16 this.age = age;
17 }
18 public String sayHello(String name,int age) { //定义sayHello()方法
19 return "大家好,我是"+name+",今年"+age+"岁!";
20 }
21 }
22 public class ReflectDemo04 {
23 public static void main(String[] args) throws Exception{
24 // 实例化Class对象
25 Class clazz = Class.forName("cn.itcast.chapter08.reflection.Person");
26 // 获取Person类中名为sayHello的方法,该方法有两个形参,分别为String类型和int类型
27 Method md = clazz.getMethod("sayHello", String.class, int.class);
28 // 调用sayHello()方法
29 String result = (String) md.invoke(clazz.newInstance(), "张三",35);
30 System.out.println(result);
31 }
32 }
运行结果如图1所示。
图1 运行结果
在例1中,第25行代码用于获取Person类的Class实例,第27行代码用于返回sayHello()方法所对应的Method对象,由于sayHello()方法本身要接收两个参数,因此在使用Class实例的getMethod()方法时,除了要指定方法名称外,也需要指定方法的参数类型。在第29行代码中,通过Method对象的invoke()方法实现sayHello()方法的调用,并接收sayHello()方法所传入的实参。