通過反射調用類中的方法,具體實現起來要注意兩點:
(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 }
運行結果如下:
