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); //相當(dāng)于 cat調(diào)用父類的print方法animalMethod.invoke(animal);//相當(dāng)于 animal.print();catMethod.invoke(cat); //相當(dāng)于 cat.print();catMethod.invoke(animal);}}
執(zhí)行結(jié)果如下
Cat.print()Animal.print()Cat.print()Exception in thread 'main' java.lang.IllegalArgumentException: object is not an instance of declaring classat 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的實例對象去執(zhí)行print()方法。其中animalMethod.invoke(animal)和catMethod.invoke(cat),示例對象的真實類型和Method的聲明Classs是相同的,按照預(yù)期打印結(jié)果;animalMethod.invoke(cat)中,由于Cat是Animal的子類,按照多態(tài)的特性,子類調(diào)用父類的的方法,方法執(zhí)行時會動態(tài)鏈接到子類的實現(xiàn)方法上。
因此,這里會調(diào)用Cat.print()方法;而catMethod.invoke(animal)中,傳入的參數(shù)類型Animal是父類,卻期望調(diào)用子類Cat的方法,因此這一次會拋出異常。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持好吧啦網(wǎng)。
相關(guān)文章:
1. XML在語音合成中的應(yīng)用2. XML 非法字符(轉(zhuǎn)義字符)3. ASP將數(shù)字轉(zhuǎn)中文數(shù)字(大寫金額)的函數(shù)4. .NET Core 分布式任務(wù)調(diào)度ScheduleMaster詳解5. HTML5實戰(zhàn)與剖析之觸摸事件(touchstart、touchmove和touchend)6. XML入門的常見問題(三)7. jscript與vbscript 操作XML元素屬性的代碼8. .NET Framework各版本(.NET2.0 3.0 3.5 4.0)區(qū)別9. HTTP協(xié)議常用的請求頭和響應(yīng)頭響應(yīng)詳解說明(學(xué)習(xí))10. 不要在HTML中濫用div
