当前位置: 移动技术网 > IT编程>开发语言>Java > Java Method类及invoke方法原理解析

Java Method类及invoke方法原理解析

2020年08月02日  | 移动技术网IT编程  | 我要评论

在说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的方法,因此这一次会抛出异常。

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

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网