通过反射机制还可以调用方法,这与调用构造方法类似。调用方法需要使用Method对象,它对应着一 个方法,获得Method对象需要使用Class类的如下方法:
Method[] getMethods():返回所有公有方法Method对象数组。
Method[] getDeclaredMethods():返回所有方法Method对象数组。
Method getMethod(String name, Class… parameterTypes):通过方法名和参数类型返回公有方法 Method对象。参数parameterTypes是Class数组,指定方法的参数列表。
Method getDeclaredMethod(String name, Class… parameterTypes):通过方法名和参数类型返回方 法Method对象。参数parameterTypes同上。
现有一个Person类:
public class Person { public String name; public int age; public void setName(String name) { this.name = name; } public String getName() { return name; } public void setAge(int age) { this.age = age; } public int getAge() { return age; } public void setNameAndAge(String name,int age){ this.name = name; this.age = age; } @Override public String toString() { return "Person{" + "name='" + name + '\'' + ", age=" + age + '}'; } }
现在编写一个程序通过反射机制调用Person类setNameAndAge和getName方法,具体代码如下:
import java.lang.reflect.Method; public class HelloWorld { public static void main(String[] args) { try{ Class clz = Class.forName("Java反射机制.调用方法.Person"); // 调用默认构造方法 Person person = (Person) clz.newInstance(); System.out.println(person); // 1.指定参数类型 Class[] params = new Class[2]; // 第一个参数是String params[0] = String.class; // 第二个参数是int params[1] = int.class; // 2.获取setNameAndAge方法对象 Method method = clz.getMethod("setNameAndAge",params); // 3。设置传递参数 Object[] argObjs = new Object[2]; // 第一个参数传递Tony argObjs[0] = "Tony"; // 第二个参数传递21 argObjs[1] = 21; // 4.调用setNameAndAge方法,person是要调用的对象,argObjs是设置要传递的参数值 method.invoke(person,argObjs); System.out.println(person); // 获取getName方法对象,该方法没有参数 method = clz.getMethod("getName"); // 调用getName方法 Object result = method.invoke(person); System.out.println(result); } catch (Exception e) { e.printStackTrace(); } } }
运行结果:
Person{name='null', age=0} Person{name='Tony', age=21} Tony