java中字节码_Java字节码介绍

对JVM内幕有一些概念之后,我们可以看一下从示例代码生成的一些基本的字节码示例。一个Java类文件中的每个方法都有一个由一系列指令组成的代码片段,每个指令都有如下的格式:

操作符(1个字节) 操作数1(可选) 操作数2(可选)......

这是一条指令,由一个字节的操作符和零个或者多个操作数组成,操作数包含了要进行运算的数据。

在当前执行方法的栈帧中,一条指令可以在操作数栈上进行push或者pop操作,并且它可能在局部变量数组中加载或者保存数值。让我们来看一下简单的例子:

205c452a1a84b548d4ab8611d725e083.png

为了打印出编译好的类中的字节码(假定它的文件名是Test.class),我们可以运行javap工具:

javap -v Test.class

我们会得到如下的结果:

c4a3f9b5e347e69a98c9c3b0fe343895.png

为了打印出编译好的类中的字节码(假定它的文件名是Test.class),我们可以运行javap工具:

javap -v Test.class

我们会得到如下的结果:

7af544874b82592162e8e43646c1eaad.png

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

7876612a55091dcd6a76eb413c925248.png

iconst_2: 把整型常量2入栈。

17ce48aa27ba31c72791964704c6c3e0.png

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

acc8198aa2f0017a984cd5198ade3237.png

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

fec93592e7955193e2e2d0f0e1cb8fdb.png

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

1e0792bc42ad4ef930e4b016d40d651a.png

iadd: 从操作数栈中取出两个int值,求和,并把结果放回栈顶

cf6e02318fa93a6654fa3d2475d53b6c.png

istore_3: 从操作数栈顶取出int值,并把它保存在序号为3的局部变量中,也就是变量c

5faa423e86587ee555e74f439eac4a4e.png

return: 从void方法返回。

以上的每一个指令都仅由一个操作符组成,它指定了需要JVM执行的确切操作。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值