java虚拟机中方法的调用

java虚拟机中方法的调用

方法调用

方法并不等同于方法执行,方法调用的阶段唯一任务就是确定被调用的是哪个方法,暂时还不设计方法的运行过程

所有方法调用的中目标方法在class文件中都是一个常量池中的符号引用,在类的加载和解析阶段,会将其中一部分引用符号直接转换为直接引用,这种解析能成立的前提是:方法在程序运行之前就已经确定有一个确定的调用版本(确定调用的方法)并且这个方法在版本运行期间不会发生改变,换个说法就是方法写好,编译器经行编译的时候就必须确定下来,这类方法的调用被称之为解析

在Java语言中符合,编译期可知,运行期间不可改变这个要求的方法,主要包括静态方法和私有方法两大类,前者与类型直接关联,后者在外部不可被访问,这两种方法各自的特点决定了不能通过其他方式重写或者继承其他版本,因此他们都适合在类的加载阶段进行解析

与之相对应的是,在Java虚拟机里面提供了5条方法调用字节码指令,分别如下。

invokestatic:调用静态方法。
invokespecial:调用实例构造器<init>方法、 私有方法和父类方法。
invokevirtual:调用所有的虚方法。
invokeinterface:调用接口方法,会在运行时再确定一个实现此接口的对象。
invokedynamic:先在运行时动态解析出调用点限定符所引用的方法,然后再执行该方法,在此之前的4条调用指令,分派逻辑是固化在Java虚拟机内部的,而invokedynamic指令的分派逻辑是由用户所设定的引导方法决定的。

只要能被invokestatic和invokespecial指令调用的方法,都可以在解析阶段中确定唯一的调用版本,符合这个条件的有静态方法、 私有方法、 实例构造器、 父类方法4类,它们在类加载的时候就会把符号引用解析为该方法的直接引用。

这些方法可以称为非虚方法,与之相反,其他方法称为虚方法(除去final方法)

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值