Java字节码指令

1,064 阅读2分钟

Java字节码指令

Java虚拟机是基于栈的架构,其指令有操作码和操作数组成。

指令

栈操作指令

  • load:用于将局部变量表的指定位置的响应类型变量加载到栈顶;(iload, lload, fload, dload, aload[ref类型变量进栈])
  • store: 用于将栈顶的相应类型数据保存到局部变量表的指定位置
  • const、push:将相应类型的常量放入栈顶;(aconst_null[null进栈],iconst_m1[int型常量-1进栈],lconst_x, fconst_x, dconst_x,bipush[byte型常量进栈],sipush[short类型常量进栈])
  • ldc:从常量池中取出常量放入栈顶

注:当const将常量加载到操作栈顶时,如果超过5,使用指令bipush;

常量池操作 含义
ldc int,float,String型常量从常量池推送至栈顶
ldc_w int,float,String型常量从常量池推送至栈顶(宽索引)
ldc2_w long,double型常量从常量池推送至栈顶(宽索引)
  • pop:栈顶数值出栈操作
  • dup:赋值栈顶的指定个数的数值,并将其压入栈顶指定次数
  • swap:栈顶的两个数值互换,且不能是long/double

字段调用

  • getstatic: 获取类的静态字段,将其值压入栈顶
  • putstatic:给类的静态字段赋值
  • getfield: 获取对象的字段,将其值压入栈顶
  • putfield: 给对象字段赋值

方法调用

  • invokevirtual:调用实例方法
  • invokestatic:调用类方法
  • invokeinterface:调用接口方法
  • invokespecial:调用特殊实例方法
  • invokedynamic:由用户引导方法决定

方法返回

  • ireturn: return int value
  • lreturn: return long value
  • freturn: return float value
  • dreturn: return double value
  • areturn: return ref value

对象和数组

  • new:创建类实例
  • newarray,anewarray,multianewarray: 创建数组
  • xload(x):数组加载到操作数栈(x为b,c,s,i,f,d,a)
  • arraylength: 数组长度
  • instanceof,checkcast:类实例类型

运算指令

运算 int long float double
加法 iadd ladd fadd dadd
减法 isub lsub fsub dsub
乘法 imul lmul fmul dmul
除法 idiv ldiv fdiv ddiv
求余 irem lrem frem drem
取反 ineg lneg fneg dneg
按位或 ior lor
按位与 iand land
自增 iin

类型转换

  • 宽化类型小范围-》大范围:int,long, float ,double
  • 窄化类型,显示调用指令(虚拟机不会抛出异常)如i2b,i2c, f2i

流程控制

  • 条件分支:ifeq,iflt, ifnull, ifnonnull
  • 复合分支:tableswitch,lookupswitch
  • 无条件分支:goto, goto_w, jsr, jsr_w, ret

同步与异常

  • 异常指令:athrow,虚拟机中处理异常采用异常表完成(对应代码的catch)
  • 同步:方法级同步和方法内部分代码同步,依靠管程(Monitor)实现;monitorenter,monitorexit