久久r热视频,国产午夜精品一区二区三区视频,亚洲精品自拍偷拍,欧美日韩精品二区

您的位置:首頁技術(shù)文章
文章詳情頁

Java Method類及invoke方法原理解析

瀏覽:9日期: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); //相當(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)。

標(biāo)簽: Java
相關(guān)文章:
主站蜘蛛池模板: 阜新市| 巴南区| 栾城县| 丹东市| 阳江市| 清原| 长宁县| 资讯 | 邛崃市| 濉溪县| 三明市| 岳西县| 秦皇岛市| 屏东市| 玉山县| 木里| 珲春市| 兴海县| 洛扎县| 宁乡县| 克什克腾旗| 余干县| 云浮市| 石楼县| 诸暨市| 都匀市| 麻阳| 永嘉县| 利川市| 平昌县| 华阴市| 兴隆县| 宽城| 榆林市| 岗巴县| 林州市| 资兴市| 上蔡县| 修武县| 宿迁市| 芷江|