java.lang.reflect.Method.invoke()方法範例

2019-10-16 22:48:13

java.lang.reflect.Method.invoke(Object obj, Object... args)方法使用指定的引數呼叫由此Method物件表示的底層方法,個別引數自動展開以匹配原始形式引數,原始參考引數和參考引數都需要進行方法呼叫轉換。

宣告

以下是java.lang.reflect.Method.invoke(Object obj, Object... args)方法的宣告。

public Object invoke(Object obj, Object... args)
   throws IllegalAccessException, IllegalArgumentException,
InvocationTargetException

引數

  • obj - 呼叫底層方法的物件。
  • args - 用於方法呼叫的引數。

返回值

  • 使用引數args將由物件表示的方法排程obj上的結果。

異常

  • IllegalAccessException - 如果此方法物件正在強制執行Java語言存取控制,並且底層方法無法存取。
  • IllegalArgumentException - 如果方法是一個範例方法,並且指定的物件引數不是宣告底層方法(或其子類或實現者)的類或介面的範例; 如果實際和正式引數的數量不同; 如果原始引數的解包轉換失敗; 或者如果在可能的展開之後,通過方法呼叫轉換,引數值不能轉換為相應的形式引數型別。
  • InvocationTargetException - 如果底層方法丟擲異常。
  • NullPointerException - 如果指定的物件為空,並且該方法是範例方法。
  • ExceptionInInitializerError - 如果由此方法引發的初始化失敗。

以下範例顯示java.lang.reflect.Method.invoke(Object obj, Object...args)方法的用法。

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class MethodDemo {
   public static void main(String[] args) 
      throws IllegalAccessException, IllegalArgumentException, InvocationTargetException {
      Method[] methods = SampleClass.class.getMethods();
      SampleClass sampleObject = new SampleClass();
      methods[1].invoke(sampleObject, "data");
      System.out.println(methods[0].invoke(sampleObject));
   }
}

class SampleClass {
   private String sampleField;

   public String getSampleField() {
      return sampleField;
   }

   public void setSampleField(String sampleField) {
      this.sampleField = sampleField;
   } 
}

讓我們編譯並執行上面的程式,這將產生以下結果 -

data