通过反射调用类中的方法,具体实现起来要注意两点:
(1)通过 Class 类的 getMethod 方法取的 Method 对象,并设置调用方法时需要的参数类型。
(2)使用 Method 方法调用 invoke 方法,并向该方法传递参数,其参数通常是一个类的对象。
个人总结,大致需要以下四个步骤:
1. 获取当前类的Class对象。 (通过forName()动态加载类)
2. 实例化这个Class对象。 (通过newInstance: Object obj=student.newInstance() )
3. 获取当前类的某个(些)方法
4用 方法对象名.invoke ,通过Class对象的实例,调用带相应参数的,当前类的方法。
代码如下:
******************学生类****************
类里面有两个方法,一个带参数,一个不带参数
1 package zj4_6; 2 3 import java.lang.reflect.InvocationTargetException; 4 5 public class Student { 6 public void printInfo(){ 7 System.out.println("打印学生信息"); 8 } 9 public void printAddress(String address){ 10 System.out.println("hellow,I come from "+address); 11 12 } 13 }
***********************主函数类***************************
调用Student类中的两个方法
1 package zj4_6; 2 3 import java.lang.reflect.InvocationTargetException; 4 import java.lang.reflect.Method; 5 6 public class InvokeMethod1 { 7 8 /** 9 * 通过反射,调用类中的方法 10 * @throws SecurityException 11 * @throws NoSuchMethodException 12 * @throws InstantiationException 13 * @throws InvocationTargetException 14 * @throws IllegalArgumentException 15 * @throws IllegalAccessException 16 */ 17 public static void main(String[] args) throws Exception { 18 try { 19 Class student=Class.forName("zj4_6.Student");//动态加载类,获取当前类的Class对象 20 //获取Student类名称为printinfo地方法 21 Method methods1=student.getMethod("printInfo"); 22 //调用frintInfo方法 23 methods1.invoke(student.newInstance()); //通过实例化的对象,调用无参数的方法 24 //获取类中名称为printInfo地方法,String,class是参数类型 25 Method methods2=student.getMethod("printAddress", String.class);//注意参数不是String 26 //调用printAddress方法,其中HK是方法传入的参数值 27 methods2.invoke(student.newInstance(),"HK");//通过对象,调用有参数的方法
28 } catch (ClassNotFoundException e) { 29 e.printStackTrace(); 30 } 31 } 32 }
运行结果如下: