目录

一、方法调用指令

二、方法返回指令


一、方法调用指令

方法调用指令: invokevirtual、 invokeinterface,、invokespecial、 invokestatic 、 invokedynamic。

以下5条指令用于方法调用:

  • invokevirtual指令:用于调用对象的实例方法,根据对象的实际类型进行分派(虚方法分派),支持多态,这也是Java语言中最常见的方法分派方式。(多态场景下方法的重写)
  • invokeinterface指令:用于调用接口方法,它会在运行时搜索由特定对象所实现的这个接口方法,并找出适合的方法进行调用。
  • invokespecial指令:用于调用一些需要特殊处理的实例方法,包括实例初始化方法(构造器)、私有方法和父类方法。这些方法都是静态类型绑定的,不会在调用时进行动态派发。(主要指不能被重写的一些方法)
  • invokestatic指令:用于调用命名类中的类方法(static方法),这是静态绑定的。
  • invokedynamic指令:调用动态绑定的方法,这个是JDK1.7后新加入的指令。用于在运行时动态解析出调用点限定符所引用的方法,并执行该方法。前面4条调用指令的分派逻辑都固化在java虚拟机内部,而invokedynamic指令的分派逻辑是由用户所设定的引导方法决定的。

【a】invokespecial指令举例

public void test01() {//类实例构造器方法Date date = new Date();Thread thread = new Thread();super.toString();test02();
}private void test02() {}

查看其字节码及分析如下:

【b】 invokestatic指令举例

//方法调用指令:invokestatic:静态分派
public void test03() {test04();
}public static void test04() {}

查看其字节码及分析如下:

【c】invokeinterface指令举例

public void test05() {Thread thread = new Thread();((Runnable) thread).run();Comparable<Integer> comparable = null;comparable.compareTo(123);
}

查看其字节码及分析如下:

【d】invokevirtual指令举例

public void test06() {System.out.println("hello world");Thread thread = null;thread.run();
}

查看其字节码及分析如下:

二、方法返回指令

方法调用结束前,需要进行返回,方法返回指令是根据返回值的类型区分的。

  • 包括ireturn(当返回值是 boolean、byte、char、 short和int类型时使用)、 lreturn、 freturn、 dreturn和areturn;
  • 另外还有一条return指令供声明为void的方法、实例初始化方法以及类和接口的类初始化方法使用;

返回类型

返回指令

void

return

int(boolean,byte,char,short)

ireturn

long

lreturn

float

freturn

double

dreturn

reference

areturn

  • 通过ireturn指令,将当前函数操作数栈的顶层元素弹出,并将这个元素压入调用者函数的操作数栈中(因为调用者非常关心函数的返回值),所有在当前函数操作数栈中的其他元素都会被丢弃
  • 如果当前返回的是synchronized方法,那么还会执行一个隐含的monitorexit指令,退出临界区。
  • 最后,会丢弃当前方法的整个帧,恢复调用者的帧,并将控制权转交给调用者;
//ireturn
public short returnTest01() {return 1;
}//ireturn
public boolean returnTest02() {return true;
}//ireturn
public int returnTest03() {return 1;
}//freturn
public float returnTest04() {return 1.0f;
}//dreturn
public double returnTest05() {return 1.4;
}

可以看到,byte、short、boolean跟其他指令一样,当成int类型进行处理,可以看到返回值都是ireturn。

字节码指令之方法调用与返回指令相关推荐

  1. java 字节码查看_一种查看java字节码时显示方法调用关系图的方法与流程

    本发明涉及一种代码逻辑分析方法,具体涉及一种查看java字节码时显示方法调用关系图的方法. 背景技术: 目前软件反编译领域有不少对可执行文件进行反编译的工具如IDA,也有对Java代码生成的中间码文件 ...

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

    你未必出类拔萃,但一定与众不同 方法调用 文章目录 方法调用 概述 解析 分派 静态分派 动态分派 单分派与多分派 虚拟机动态分派的实现 概述 方法调用并不等同与方法中的代码被执行,方法调用阶段唯一的 ...

  3. Java字节码角度分析方法调用 ——提升硬实力7

    在前面的文章中,有详细地介绍java字节码相关的知识,有兴趣的可以提前了解一下. 1.Java字节码的一段旅行经历--提升硬实力1 2.Java字节码角度分析a++ --提升硬实力2 3.Java字节 ...

  4. Java字节码,字节码指令

    目录 字节码 字节码指令分类 方法栈和栈帧(操作数栈,局部变量数组) 字节码指令 操作数栈相关指令 局部变量数组相关的指令 将常量加载到操作数栈上的指令 高层语义的字节码指令 字段访问指令 方法调用指 ...

  5. 【Hotspot】 执行字节码指令流程(1):堆栈的创建以及Java函数调用

    什么是基于栈的虚拟机: 关于JVM中调用Java函数需要了解一下基于栈的虚拟机: 栈是在内存中单独维护的一个结构,栈中有局部变量表,执行操作比如a+b需要调用将两个变量加载到操作数栈中,相加后放到栈顶 ...

  6. 深入理解JVM虚拟机(五):字节码指令简介

    Java 虚拟机的指令由一个字节长度的.代表着某种特定操作含义的数字(称为操作码)以及跟随其后的零至多个代表此操作所需参数(操作数)而构成.由于 Java 虚拟机采用面向操作数栈而不是寄存器的架构,所 ...

  7. Java虚拟机字节码指令概述

    虚拟机字节码指令 Java虚拟机的指令由一个字节长度的.代表着某种特定操作含义的数字(称为操作码,Opcode)以及跟随其后的零至多个代表此操作所需参数(称为操作数,Operands)而构成. 一 基 ...

  8. jvm理论-字节码指令

    Java虚拟机的指令由一个字节长度的.代表着某种特定操作含义的数字(称为操作码,Opcode)以及跟随其后的零至多个代表此操作所需参数(称为操作数,Operands)而构成. 基本数据类型 1.除了l ...

  9. java字节码指令简介(仅了解)

    [0]README 0.1)本文全文转自 "深入理解jvm", 旨在了解 java字节码指令 的基础知识: [1]写在前面 1)由于jvm 采用面向操作数栈而不是寄存器的结构,所以 ...

  10. Java字节码指令简介

    本文是<深入理解Java虚拟机>中第六章的读书笔记. 1.概述 在Class文件中,Java方法里的方法体,也就是代表着一个Java源码程序中程序的部分存储在方法表集合的Code属性中.存 ...

最新文章

  1. 单精度和半精度混合训练
  2. DVWA的安装与简单使用
  3. 2022 年计算机视觉的三大趋势
  4. 更新租约和检测数据完整性脚本
  5. iPad随想:苹果的妙招、谷歌的尴尬和中移动MM的局限
  6. Fiddler 抓包高级进阶篇-天罗地网抓包大法
  7. secureCRT连接问题
  8. 趣图:BAT程序员的一天对比
  9. 【炼丹技巧】指数移动平均(EMA)【在一定程度上提高最终模型在测试数据上的表现(例如accuracy、FID、泛化能力...)】
  10. 渗透测试入门9之域渗透
  11. srm开发(基于ssh)(4)
  12. mysql清除旧版本_MYSQL使用INNODB时及时清理旧版本数据
  13. java邻接表无向图的创建_无向图的邻接表创建以及图的深度和…
  14. eclipse汉化方法取消汉化退回英文版
  15. 奖补多的2022年合肥高新区高成长企业申报时间入选范围及申报条件材料
  16. 软件文档的类型有哪些?
  17. 开机动画desc.txt描述文件的分析
  18. linux php 编程 pdf 百度云,Linux下的Perl编程 pdf版
  19. 什么P图软件可以换发型?照片换分享软件分享
  20. HDU 5238 Calculator(中国剩余定理+线段树)

热门文章

  1. 多模块顺序_广东省考行测时间如何分配?答题顺序的建议?
  2. gitee java pdf转图片_openOffice word转pdf,pdf转图片优化版
  3. C/C++[codeup 1929,]今天星期几
  4. 算法: 最大正方形面积221. Maximal Square
  5. MLOps- 吴恩达Andrew Ng Selecting and Training a Model Week2 论文等资料汇总
  6. 翻译:如何理解梯度下降算法Gradient Descent algorithm
  7. 发布传参_Taro 1.2.9 发布,BAT 小程序、H5 与 RN 端统一框架
  8. 计算机科学导论_学长说专业 | 计算机科学与技术
  9. 2021_0207_生活记录
  10. AR/VR learning (1)--artoolkit在android studio 上的配置