欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Java Method类及invoke方法原理解析

程序员文章站 2022-04-05 18:39:23
在说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的方法,因此这一次会抛出异常。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。