Java Method类及invoke方法原理解析

 更新时间:2020年08月01日 08:36:04   转载 作者:小尾学长  
这篇文章主要介绍了Java Method类及invoke方法原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

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

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

相关文章

  • 使用SpringBoot-JPA进行自定义保存及批量保存功能

    使用SpringBoot-JPA进行自定义保存及批量保存功能

    这篇文章主要介绍了使用SpringBoot-JPA进行自定义的保存及批量保存功能,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-06-06
  • Eclipse添加xml文件提示及Hibernate配置学习

    Eclipse添加xml文件提示及Hibernate配置学习

    文件提示功能在开发过程中很实用的,本文实现了一个Eclipse添加xml文件提示,感兴趣的朋友可以了解下啊,希望本文对你有所帮助
    2013-01-01
  • java 中ThreadPoolExecutor原理分析

    java 中ThreadPoolExecutor原理分析

    这篇文章主要介绍了java 中ThreadPoolExecutor原理分析的相关资料,需要的朋友可以参考下
    2017-03-03
  • Spring实战之使用ClassPathResource加载xml资源示例

    Spring实战之使用ClassPathResource加载xml资源示例

    这篇文章主要介绍了Spring实战之使用ClassPathResource加载xml资源,结合实例形式分析了Spring使用ClassPathResource加载xml资源的具体实现步骤与相关操作技巧,需要的朋友可以参考下
    2019-12-12
  • spring cloud zuul修改请求url的方法

    spring cloud zuul修改请求url的方法

    这篇文章主要给大家介绍了关于spring cloud zuul修改请求url的方法,文中通过示例代码介绍的非常详细,对大家学习或者使用spring cloud具有一定的参考学习价值,需要的朋友们下面来一起看看吧。
    2017-09-09
  • win7下安装 JDK 基本流程

    win7下安装 JDK 基本流程

    这篇文章主要介绍了win7下安装 JDK 基本流程,需要的朋友可以参考下
    2014-05-05
  • Java中分割字符串的两种方法实例详解

    Java中分割字符串的两种方法实例详解

    这篇文章主要介绍了Java中分割字符串的两种方法,一种是java.lang.String 的 split() 方法,,另外一种是用String Tokenizer类。文中的每种方法都给出了详细的示例代码,相信对大家的理解和学习具有一定的参考借鉴价值,有需要的朋友们下面来一起看看吧。
    2016-12-12
  • Java计算两个日期时间之间的天数最简方法

    Java计算两个日期时间之间的天数最简方法

    这篇文章给大家分享了Java计算两个日期时间之间的天数最简单的实现方法,有兴趣的朋友可以参考学习下。
    2018-07-07
  • 基于RabbitMQ的简单应用(详解)

    基于RabbitMQ的简单应用(详解)

    下面小编就为大家分享一篇基于RabbitMQ的简单应用(详解),具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2017-11-11
  • SpringBoot使用thymeleaf模板过程解析

    SpringBoot使用thymeleaf模板过程解析

    这篇文章主要介绍了SpringBoot使用thymeleaf模板过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-12-12

最新评论