Java中Method類和invoke方法詳解
阿新 • • 發佈:2020-07-28
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