Java字节码介绍【二】

本文为翻译的文章,作者Mahmoud Anouti,原文:
https://dzone.com/articles/introduction-to-java-bytecode

字节码探索:

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

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

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

在当前执行方法的栈帧中,一条指令可以在操作数栈上进行push或者pop操作,并且它可能在局部变量数组中加载或者保存数值。让我们来看一下简单的例子:
在这里插入图片描述
为了打印出编译好的类中的字节码(假定它的文件名是Test.class),我们可以运行javap工具:

javap -v Test.class

我们会得到如下的结果:
在这里插入图片描述
我们可以从main方法的方法签名中看出,它的输入参数是一个String数组([Ljava/lang/String; ),并且有一个void返回类型(V)。其后的一组标记描述了方法是public (ACC_PUBLIC)和static的(ACC_STATIC)。

最重要的部分是Code属性,它包含了方法的指令,以及象操作数栈最大深度(这个案例是2个)、为栈帧中的方法分配的局部变量个数(这个案例是4个)这样的信息。所有的局部变量都被上面的指令引用了,除了第一个(序号是0),它持有了对于args参数的引用。另外三个局部变量对应于源码中的a,b,c三个变量。

从地址0到8的指令会进行如下的操作:

iconst_1: 把整型常量1入栈。
在这里插入图片描述
istore_1: 最上面的操作数出栈(一个int值),并把它保存在序号为1的局部变量中,它对应于变量a。
在这里插入图片描述
iconst_2: 把整型常量2入栈。
在这里插入图片描述
istore_2: 最上面的int操作数出栈,并把它保存在序号为2的局部变量中,它对应于变量b。
在这里插入图片描述
iload_1: 从序号1的局部变量中加载int值,并把它压入栈顶。
在这里插入图片描述
iload_2:从序号2的局部变量中加载int值,并把它压入栈顶。
在这里插入图片描述
iadd: 从操作数栈中取出两个int值,求和,并把结果放回栈顶
在这里插入图片描述
istore_3: 从操作数栈顶取出int值,并把它保存在序号为3的局部变量中,也就是变量c.
在这里插入图片描述
return: 从void方法返回。

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

欢迎关注微信公众号,获取更多信息。
在这里插入图片描述

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值