学科分类
目录
Java Web

通过反射调用方法

当获得某个类对应的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()方法所传入的实参。

点击此处
隐藏目录