Java字节码介绍

对JVM内幕有一些概念之后,我们可以看一下从示例代码生成的一些基本的字节码示例。一个Java类文件中的每个方法都有一个由一系列指令组成的代码片段,每个指令都有如下的格式:
操作符(1个字节) 操作数1(可选) 操作数2(可选)…
这是一条指令,由一个字节的操作符和零个或者多个操作数组成,操作数包含了要进行运算的数据。
在当前执行方法的栈帧中,一条指令可以在操作数栈上进行push或者pop操作,并且它可能在局部变量数组中加载或者保存数值。让我们来看一下简单的例子:
Java字节码介绍

为了打印出编译好的类中的字节码(假定它的文件名是Test.class),我们可以运行javap工具:
javap -v Test.class
我们会得到如下的结果:Java字节码介绍

为了打印出编译好的类中的字节码(假定它的文件名是Test.class),我们可以运行javap工具:
javap -v Test.class
我们会得到如下的结果:Java字节码介绍

为了打印出编译好的类中的字节码(假定它的文件名是Test.class),我们可以运行javap工具:
javap -v Test.class
我们会得到如下的结果:Java字节码介绍

istore_1: 最上面的操作数出栈(一个int值),并把它保存在序号为1的局部变量中,它对应于变量aJava字节码介绍

iconst_2: 把整型常量2入栈。Java字节码介绍

istore_2: 最上面的int操作数出栈,并把它保存在序号为2的局部变量中,它对应于变量bJava字节码介绍

iload_1: 从序号1的局部变量中加载int值,并把它压入栈顶。Java字节码介绍

iload_2:从序号2的局部变量中加载int值,并把它压入栈顶Java字节码介绍

iadd: 从操作数栈中取出两个int值,求和,并把结果放回栈顶Java字节码介绍
istore_3: 从操作数栈顶取出int值,并把它保存在序号为3的局部变量中,也就是变量c
return: 从void方法返回。
以上的每一个指令都仅由一个操作符组成,它指定了需要JVM执行的确切操作。