字节码指令
# 字节码指令
# 一. 加载与存储指令
概述
加载和存储指令作用于将数据于栈帧的局部变量表和操作数栈之间来回传递。
# 1.1 常用指令
入栈(压栈)指令
- xload-< n > 局部变量表加载到操作数栈。 x: i(int),l(long),f(float),d(double),a(引用类型) n: 0~3
- bipush、sipush、idc、aconst、iconst等。常量入栈指令的功能将常数压入操作数栈,根据数据类型和入栈内容不同,又可以分为const系列,push系列和idc系列。
- const系列: 用于特定的常量入栈。
- push系列: 主要包括bipush、sipush。他们的区别在于接收数据类型的不同,bipush接收8位整数作为参数,sipush接收16位整数。他们都将参数压入栈。
- idc系列: 以上指令都不满足需求,那么可以使用万能的idc指令。它可以接收一个8位的参数,该参数指向常量池中的int、float 或者String系列,将指定的内容压入栈。
出栈指令
- xstore-< n > 操作数栈出栈加载到局部变量表。 x: i(int),l(long),f(float),d(double),a(引用类型) n: 0~3
# 二. 算数指令
概述
算法指令用于对两个操作数栈上的值进行某种特定运算,并把结果压入操作数栈。
- 加法指令: iadd、ladd、fadd、dadd
- 减法指令: isub、lsub、fsub、dsub
- 乘法指令: imul、lmul、fmul、dmul
- 除法指令: idiv、ldiv、fdiv、ddiv
- 求余指令: irem、lrem、frem、drem
- 取反指令: ineg、lneg、fneg、dneg
- 自增指令: iinc
- 位运算指令,又分为:
- 位移指令: ishl、ishr、iushr、lshl、lshr、lushr
- 按位或指令: ior、lor
- 按位与指令: iand、land
- 按位异或指令: ixor、lxor
- 比较指令: dcmapg、dcmpl、fcmpg、fcmpl、lcmp
# 三.创建类和数组实例指令
概述
类实例和数组都是对象,但Java虚拟机对类实例和数组的创建与操作使用了不同的字节码指令
# 3.1 创建类实例的指令
- new
- 接收一个参数,为指向常量池的索引,表示要创建的类型,执行完后的,将对象的引用压入栈。
# 3.2 创建数组实例的指令
- newarray、anewarray、multianewarray
- newarray: 创建基本类型数组
- anewarray: 创建引用类型数组
- multianewarray: 创建多维数组
# 四.字段访问指令
概述
对象创建后,就可以通过对象访问指令获取对象实例或数组实例中的字段或者数组元素。
# 4.1 访问类字段指令
- static字段或者称为类变量的指令: getStatic、putstatic
- getstatic: 压栈操作
- putstatic: 出栈操作
# 4.2 访问类实例字段
- 非static字段或者称为实例变量的指令: getfield、putfield
- getfield: 压栈操作
- putfield: 出栈操作
# 五.数组指令
概述
数组操作指令主要有: xastore和xaload指令
# 5.1 将数组元素加载到操作数栈指令:
- baload、caload、saload、iaload、laload、faload、daload、aaload
# 5.2 将操作数栈的值存储到数组元素中的指令:
- bastore、castore、sastore、iastore、lastore、fastore、dastore、aastore
# 六.方法调用指令
概述
方法调用指令: invokevirtual、invokeinterface、invokespecial、invokestatic、invokedynamic
# 6.1 方法调用:
- invokevirtual指令用于调用对象的实例方法,根据对象的实例类型进行分派(虚方法分派),支持多态。这也是Java语言中最常见的方法分派方式
- invokeinterface指令用于调用接口方法,它会在运行时搜索由特定对象所实现的这个接口方法,并找出适合的方法进行调用
- invokespecial指令用于调用一些需要特殊处理的实例方法,包括实例初始化方法(构造器)、私有方法和父类方法。这些方法都是静态类型绑定的。不会在调用时进行动态派发。
- invokestatic指令用于调用命类中的类方法,这是静态绑定的。
# 七.方法返回指令
概述
方法调用结束前,需要进行返回,方法fan'hui指令是根据返回值的类型区分的
- 包括ireturn (当返回值是boolean、byte、char、short和int类型时使用)lreturn、freturn、dreturn和areturn
- 另外还有一条return 指令供声明为 void的方法,实例初始化方法以及类和接口的类初始化方法使用。
编辑 (opens new window)
上次更新: 2023/04/18, 14:59:17