1. 程式人生 > 實用技巧 >Java中Method類和invoke方法詳解

Java中Method類和invoke方法詳解

Java中Method類和invoke方法詳解

在說Method和invoke的使用之前我們來看一個小例子, 如果看懂了那就ok了

public class MethodInvoke {
 
  class Animal {
    public void print() {
      System.out.println("Animal.print()");
    }
  }

  class Cat extends Animal {

    @Override
    public void print() {
      System.out.println("Cat.print()");
    }
  }
  
	public static void main(String[] args) throws Exception {
		Method animalMethod = Animal.class.getDeclaredMethod("print");
		Method catMethod = Cat.class.getDeclaredMethod("print");
		
		Animal animal = new Animal();
		Cat cat = new Cat();
		animalMethod.invoke(cat); //相當於 cat呼叫父類的print方法
		animalMethod.invoke(animal);//相當於 animal.print();
		
		catMethod.invoke(cat); //相當於 cat.print();
		catMethod.invoke(animal);
	}
	
}

執行結果如下

Cat.print()
Animal.print()
Cat.print()
Exception in thread "main" java.lang.IllegalArgumentException: object is not an instance of declaring class
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)

程式碼中,Cat類覆蓋了父類Animal的print()方法, 然後通過反射分別獲取print()的Method物件。最後分別用Cat和Animal的例項物件去執行print()方法。其中animalMethod.invoke(animal)和catMethod.invoke(cat),示例物件的真實型別和Method的宣告Classs是相同的,按照預期列印結果;animalMethod.invoke(cat)中,由於Cat是Animal的子類,按照多型的特性,子類呼叫父類的的方法,方法執行時會動態連結到子類的實現方法上。因此,這裡會呼叫Cat.print()方法;而catMethod.invoke(animal)中,傳入的引數型別Animal是父類,卻期望呼叫子類Cat的方法,因此這一次會丟擲異常。

Method和invoke原始碼解析連結:https://blog.csdn.net/wenyuan65/article/details/81145900