国产成人精品亚洲777人妖,欧美日韩精品一区视频,最新亚洲国产,国产乱码精品一区二区亚洲

您的位置:首頁技術文章
文章詳情頁

Java Method類及invoke方法原理解析

瀏覽:4日期:2022-08-27 16:38:56

在說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 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的實例對象去執行print()方法。其中animalMethod.invoke(animal)和catMethod.invoke(cat),示例對象的真實類型和Method的聲明Classs是相同的,按照預期打印結果;animalMethod.invoke(cat)中,由于Cat是Animal的子類,按照多態的特性,子類調用父類的的方法,方法執行時會動態鏈接到子類的實現方法上。

因此,這里會調用Cat.print()方法;而catMethod.invoke(animal)中,傳入的參數類型Animal是父類,卻期望調用子類Cat的方法,因此這一次會拋出異常。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持好吧啦網。

標簽: Java
相關文章:
主站蜘蛛池模板: 义马市| 南雄市| 阜南县| 沧州市| 南通市| 辉县市| 松阳县| 嵩明县| 宜兰市| 合川市| 三门峡市| 蓝田县| 吉安县| 昌宁县| 措勤县| 开平市| 库尔勒市| 丹巴县| 射洪县| 仙居县| 海原县| 轮台县| 贡嘎县| 安陆市| 铜陵市| 平阳县| 古交市| 松滋市| 彭山县| 玉屏| 佳木斯市| 东港市| 河西区| 广宗县| 芜湖县| 仙居县| 安仁县| 肇源县| 太仆寺旗| 祁门县| 收藏|