通过反射,调用类中的方法

时间:2022-05-20 21:25:02

通过反射调用类中的方法,具体实现起来要注意两点:

(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 }

运行结果如下:
通过反射,调用类中的方法