1. 程式人生 > >一個Java反射機制例子

一個Java反射機制例子

package test;

import java.lang.reflect.Method;

public class InvokeTest {
  /**
   *
   * main 方法
   * @param args
   * void
   */
  public static void main(String[] args) {
    try {
      InvokeTest invokeTest = new InvokeTest();
      //1.第一步獲取方法的對映
      //String[] realArgs = {"",""};//定義一個與execute方法第1個引數對應的String陣列(注意此陣列只為獲取方法的對映)
      //Integer in = new Integer(0);//定義一個與execute方法第2個引數對應的Integer物件     
      //Class[] c_args = new Class[2];
      //c_args[0] = realArgs.getClass();//分別獲取以上兩個引數的class
      //c_args[1] = in.getClass();
      //Method method = invokeTest.getClass().getMethod("execute", c_args);//返回值為test方法的對映(型別Method)
      /**
       * 注意,以上幾句(11-16行)可以寫成下面一句
       * 目的是獲取execute方法的對映,第一個引數是方法,第二個引數是execute方法所需要的引數列表,型別是class
       * 所以當execute方法沒有引數時,getMethod第二個引數為null即可
       */
      Method method = invokeTest.getClass().getMethod("execute",
          new Class[] { String[].class, Integer.class });
     
      //2.第二步呼叫方法
      //String[] a1={"zhong","cheng"};//這裡的陣列用於做真正呼叫時的引數
      //Integer a2=new Integer(5);//同上
      //Object[] allArgs = new Object[2];
      //allArgs[0] = a1;
      //allArgs[1] = a2;
      //Object[] result = (Object[])method.invoke(invokeTest, allArgs);//呼叫execute方法並獲取返回值
      /**
       * 注意,以上幾句(21-26行)可以寫成下面一句
       * 目的是呼叫例項invokeTest的execute方法,引數(包含一個String陣列和一個Integer物件)型別是Object
       * invoke()方法的第一個引數表示被呼叫的方法所屬類的例項,所以如果execute是靜態方法,
       * invoke的第一個引數可以為空
       */
      Object[] result = (Object[])method.invoke(invokeTest, new Object[] {
          new String[] { "zhong", "cheng" }, new Integer(5) });
      //打印出返回值
      for(int i=0;i<result.length;i++){
        System.out.print(result[i]);
      }
    } catch (Exception e) {
      e.printStackTrace();
    }

  }

  /**
   *
   * 用於測試的execute方法,此處只是將String[]和Integer的值打印出來
   * 並返回一個提示性的字串陣列
   * @param String[] str
   * @param Integer intN
   * String[]
   */
  public String[] execute(String[] str, Integer intN) {
    for (int j = 0; j < str.length; j++) {
      System.out.println(str[j]);
    }
    System.out.println(intN.intValue());
    return new String[]{"display ","have ","bean ","finished "," !"};
  }
}