方法调用和分派

java虚拟机中提供了5种调用字节码指令,分别是

  invokestatic: 调用静态方法

  invokespecial:调用实例构造器<init>方法,私有方法,和父类方法.

  invokevirtual:调用虚方法.

  invokeinterfaceL调用接口方法,会在运行时再确定一个实现此接口的对象.

  invokedynamic:先在运行时动态解析出调用点 限定符所引用的方法,然后再执行该方法,在此之前的四条调用指令,分派逻辑是固化在java虚拟机的内部的,而invokedynamic指令的分派逻辑是由用户所设定的引导方法决定的.

  只要被invokestatic 和invokespecial指令调用的方法,都可以在解析阶段中确定唯一的调用版本,符合这个条件的有静态方法,私有方法,实例构造器,父类方法四类.它们在类加载的时候就会把符号引用解析为该方法的直接引用.这些方法可以称为非虚方法.与之相反,其他方法称为虚方法(除去final方法.

以上来自<<深入理解java虚拟机>>

时间: 2024-10-29 01:00:11

方法调用和分派的相关文章

Jvm(65),方法调用----静态分派调用

我们先来看一下下面的例子: package demo.jvm.test8? public class Demo2 { /** 方法静态分派演示 * @author zzm */ static abstract class Human { } static class Man extends Human { } static class Woman extends Human { } public void sayHello(Human guy) { System.out.println("hel

Jvm(67),方法调用----单分派与多分派

方法的接收者与方法的参数统称为方法的宗量,这个定义    早应该来源于<Java与模式>一书.根据分派基于多少种宗量,可以将分派划分为单分派和多分派两种.单分派是根据一个宗量对目标方法进行选择,多分派则是根据多于一个宗量对目标方法进行选择. 单分派和多分派的定义读起来拗口,从字面上看也比较抽象,不过对照着实例看就不难理解了.代码清单8-10中列举了一个Father和Son一起来做出"一个艰难的决定"的例子. package demo.jvm.test8? public cl

Jvm(66),方法调用----动态分派调用

package demo.jvm.test8? public class Demo4 { /** * 方法动态分派演示 * */ static class Human { protected void sayHello() { System.out.println("Human say hello")? }? } static class Man extends Human { protected void sayHello() { System.out.println("m

Jvm(48),指令集----方法调用和指令返回

方法调用(分派.执行过程)将在第8章具体讲解,这里仅列举以下5条用于方法调用的指令. invokevirtual指令用于调用对象的实例方法,根据对象的实际类型进行分派(虚方法分派),这也是Java语言中最常见的方法分派方式. invokeinterface指令用于调用接口方法,它会在运行时搜索一个实现了这个接口方法的对象,找出适合的方法进行调用. invokespecial指令用于调用一些需要特殊处理的实例方法,包括实例初始化方法.私有方法和父类方法. invokestatic指令用于调用类方法

多态方法调用的解析和分派

方法调用并不等同于方法执行,方法调用阶段唯一的任务就是确定被调用方法的版本(即调用哪一个方法),暂时还不涉及方法内部的具体运行过程.在程序运行时,进行方法调用是最普遍.最频繁的操作,Class文件的编译过程中不包含传统编译中的连接步骤,一切方法调用在Class文件里面存储的都只是符号引用,而不是方法在实际运行时内存布局中的入口地址(相当于之前说的直接引用).这个特性给Java带来了更强大的动态扩展能力,但也使得Java方法调用过程变得相对复杂起来,需要在类加载期间,甚至到运行期间才能确定目标方法

JVM 方法调用之静态分派

分派(Dispatch)可能是静态也可能是动态的,根据分派依据的宗量数可分为单分派和多分派.这两种分派方式的两两组合就构成了静态单分派,静态多分派,动态单分派,动态多分派这4种组合.本章讲静态分派. 1.静态分派 所有依赖静态类型来定位方法执行版本的分派动作称为静态分派.静态分派的典型应用是方法重载.静态分派发生在编译阶段,因此确定静态分派的动作实际上不是由虚拟机来执行的. 那么什么是静态类型(static type)呢? 1 Super object = new Sub(); 像上面的语句,S

关于JVM中方法调用的相关指令,以及解析(Resolution)和分派(Dispatch)的解释——重载的实现原理与重写的实现原理

JVM中相关方法的调用的指令 invokestatic 调用静态方法. invokespecial 用于调用构造器方法<init>.私有方法.父类方法. invokevirtual 用于调用类的所有虚方法. invokeinterface 用于调用接口方法. 解析(resolution)与分派(dispatch) 解析 解析调用一定是个静态的过程,在编译期间就完全确定,在类装载的解析阶段就会把涉及的符号引用全部转变 为可确定的直接引用,不会延迟到运行期再去完成. 下面我们看一段代码: /**

JVM 方法调用之解析

方法调用并不等同于方法执行,方法调用阶段唯一的任务就是确定被调用方法的版本(即调用哪一个方法),暂时还没有涉及到方法内部的具体运行过程.在程序运行时,进行方法调用是最普遍最频繁的操作,但Class文件的编译过程不包含传统编译中的连接步骤,一切方法调用在Class文件里存储的都只是符号引用,而不是方法在实际运行时内存布局中的入口地址(相当于之前说的直接引用).这个特性给Java带来了更强大的动态扩展能力,但也使得Java方法调用过程变得相对复杂起来,需要在类加载期间,甚至到了运行期间才能确定目标方

虚拟机字节码执行引擎-----方法调用

方法调用阶段唯一的任务就是确定被调用方法的版本(调用的是哪一个方法),暂时还不涉及方法内部的具体运行过程.Class文件的编译过程中 不包含传统编译过程中的"连接",一切方法调用在Class文件里面存储的都只是符号引用,而不是方法在实际运行时内存布局中的入口地址.这给java带来更强的动态扩展功能的同时,也使用java方法的调用过程变得相对复杂起来,需要在类加载期间,甚至到运行期间才能确定目标方法的直接引用. 1.解析 在类加载的解析阶段,会将一部分符号引用转化为直接引用,这种解析能成