二、常见字节码指令

二、常见字节码指令字节码

常见字节码指令

加载和存储指令

加载(load)和存储(store)相关的指令是使用得最频繁的指令,分为load类、stroe类、常量加载这三种。

  • load类指令
    load类指令是将局部变量表中的变量加载到操作数栈。
    比如iload_0将局部变量表中下标为0的int型变量加载到操作数栈上,根据不同的数据变量类型还有lload、fload、dload、aload这些指令,分别代表long、float、double、引用类型的变量。




  • store类指令
    store类指令是将栈顶的数据存储到局部变量表中。
    比如istore_0是将操作数栈顶的int类型元素存储到局部变量表中下标为0的位置。
    根据不同的数据变量类型还有lstore、fstore、dstore、astore这些指令。






  • 常量加载相关指令
    常见的有const类、push类、ldc类。
    const、push类指令是将常量值直接加载到操作数栈顶,如iconst_0是将整数0加载到操作数栈顶,bipush100是将int类型100加载到操作数栈顶。
    ldc指令是从常量池加载对应的常量到操作数栈顶,如ldc #10是将常量池中下下标为10的常量数据加载到操作数栈顶。#表示常量池的下标。






常用存储指令
指令描述
aconst_null把null压入栈顶
iconst_m1把-1压入栈顶
iconst_
把int类型值(0~5)压入栈顶
bipush把-128~127的int类型值压入栈顶,如bipush 100
ldc把常量值从常量池压入栈顶,如ldc #10

load
把类型为T的变量从局部变量表的指定位置压入栈顶,如iload 10。T可为i、l、f、d、a,其中a为引用类型,如aload 0

load_

把类型为T的变量从局部变量表下标为n(0~3)的位置压入栈顶,如iload_1

aload
将指定数组中类型为T的数据从指定位置压入栈顶

store
将栈顶类型为T的数据存储到局部变量表的指定位置,如astore 2

store_

将栈顶类型为T的数据存储到局部变量表下标为n(0~3)的位置

astore
将栈顶类型为T的数据存储到指定数组的指定位置

操作数栈指令

常见的操作数栈指令有pop、dup和swap。

指令 描述
pop 将栈顶的数据出栈(非long和double类型)
pop2 将栈顶的数据出栈(long或double类型)或两个其他类型的数据出栈
dup 复制栈顶数据,并将复制的数据入栈
dup_x1 复制栈顶数据,并将复制的数据插入栈顶第二个元素之下
dup2 复制栈顶的两个数据并入栈
swap 交换栈顶的两个元素
  1. pop指令
    用于将栈顶的值出栈。一个场景的场景是调用了有返回值的方法,但没有使用这个返回值。

public String foo() { return "str"; } public void bar() { foo(); \\没有接收foo()方法的返回值 } 

bar()方法对应的字节码

0: aload_0 1: invokevirtual #13 2: pop \\用来弹出调用bar方法的返回值 3: return 
  1. dup指令
    用于复制栈顶的元素并压入栈顶。

  2. swap指令
    用于交换栈顶的两个元素。

运算和类型转换指令

运算符 指令(int) 指令(long) 指令(float) 指令(double)
+ iadd ladd fadd dadd
isub lsub fsub dsub
* imul lmul fmul dmul
/ idiv ldiv fdiv ddiv
% irem lrem frem drem
negate(-:取反) ineg lneg fneg dneg
& iadn land
| ior lor
^ ixor lxor

有多种类型数据混合运算是,系统会自动将数据转换为范围更大的数据类型,称为宽化类型转换(widening)或自动类型转换。
宽化类型转换并不意味着不会丢失精度。
把范围大的数据类型转换为范围小的数据类型,称为窄化类型转换(narrowing)或强制类型转换。




控制转移指令

指令 描述
ifeq 如果int类型栈顶元素=0,则跳转
ifne 如果int类型栈顶元素≠0,则跳转
iflt 如果int类型栈顶元素<0,则跳转
ifge 如果int类型栈顶元素>=0,则跳转
ifgt 如果int类型栈顶元素>0,则跳转
ifle 如果int类型栈顶元素<=0,则跳转
if_icompeq 比较栈顶两个int类型元素,=则跳转
if_icmpne 比较栈顶两个int类型元素,≠则跳转
if_icmplt 比较栈顶两个int类型元素,
<则跳转< td="">
if_icmpge 比较栈顶两个int类型元素,>=则跳转
goto 无条件跳转
tabelswitch switch条件跳转,case值紧凑的情况下使用
lookupswitch swithc条件跳转,case值稀疏的情况下使用
public int isPositive(int n) { if (n > 0) { return 1; } else { return 0; } } 

字节码

0: iload_1 1: ifle 4 4: iconst_1 5: ireturn 6: iconst_0 7: ireturn 

其他

指令 描述
iinc 直接对局部变量表的数据进行加运行,如iinc 5,1表示对局部变量表下标为5的值+1。该操作无需对局部变量表数据做入栈相加出栈操作
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/176173.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月26日 下午10:33
下一篇 2026年3月26日 下午10:33


相关推荐

  • 剪映专利展示怎么做

    剪映专利展示怎么做

    2026年3月15日
    2
  • 高通repeater模式比较

    高通repeater模式比较reperter 列举开发方法及优缺点对比

    2026年3月17日
    5
  • ssh和sftp为什么是同一端口_ssh和sftp使用不同的端口

    ssh和sftp为什么是同一端口_ssh和sftp使用不同的端口8种机械键盘轴体对比本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选?1.1描述SFTP(SSHFileTransferProtocol)即安全文件传送协议),是一数据流连接,提供文件访问、传输和管理功能的网络传输协议。其功能旨在允许客户端主机可以像访问本地存储一样通过网络访问服务器端文件。sftp是基于ssh上实现的,所以严格来说我们是无法来关闭ssh,而只是使用sftp。ssh…

    2025年11月15日
    4
  • 【网络课程设计】校园网规划方案

    【网络课程设计】校园网规划方案以前自己做的网络课程设计 用了思科软件 具体的文件包和 word 见另外的文章无锡科技职业学院校园网规划方案 1 需求分析 1 1 校园网总体概述无锡科技职业学院位于无锡市新吴区新锡路 8 号 其学习内部划分多个楼层 共有三个局域网站组成一个大型的校园网 分别为宿舍区域 教学区域 以及实训区域 每个部门又有众多人数 总体加起来也有 500 人 这三个区域又分别由三台路由器组合而成 形成了一个校园网站 1 2 校园网络基本要求网络自身的需求受多方面因素影响 网络的课伸缩性 现有网络所支持的业务 网络

    2026年3月19日
    1
  • unittest框架–verbosity详解

    unittest框架–verbosity详解verbosity 是一个选项 表示测试结果的信息复杂度 有 0 1 2 三个值 0 静默模式 只能获取总的测试数和总的执行结果 比如成功 3 失败 4 1 默认模式 非常类似静默模式 只是在每个成功的测试用例前面会有 在每个失败的测试用例前面有 F 2 详细模式 测试结果会显示每个测试用例的所有相关的信息并且你在命令行里加入不同的参数可以起到一样的效果加入 quiet 参数等效于 verbosity 0 加入 verbose 参数等效于 verbosity 2 什么都不加就

    2026年3月18日
    2
  • java中遍历数组_java循环取数组值

    java中遍历数组_java循环取数组值第一种方法(传统方法)inta[]={1,2,3,4,5};for(inti=0;i<a.length;i++){System.out.println(a[i]);}第二种方法(非传统方法)inta[]={1,2,3,4,5};for(inti:a){System.out.println(i);}注意:其中i的数据类型要和数组a的数组类型保持一致。第三种方…

    2026年1月22日
    6

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号