Java Method类及invoke方法原理解析
程序员文章站
2022-07-09 15:22:46
在说method和invoke的使用之前我们来看一个小例子, 如果看懂了那就ok了public class methodinvoke { class animal { public void pr...
在说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的方法,因此这一次会抛出异常。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。