Java字节码简介

本文介绍了Java字节码的基础知识,包括字节码文件的组成:魔数、版本号、常量池、访问标志、类名、父类名、接口信息、字段信息、方法表和附加属性表。通过对这些组成部分的解析,帮助读者深入理解Java代码如何在JVM中运行,特别是字节码在执行过程中的作用。
摘要由CSDN通过智能技术生成

参考文献:

https://blog.csdn.net/bjweimengshu/article/details/100718955?utm_medium=distribute.pc_relevant.none-task-blog-baidujs_title-6&spm=1001.2101.3001.4242

java代码运行于JVM中,而jvm要运行java代码首先要做的就是加载字节码,也就是.java文件经过编译变成的.class文件。jvm运行的指令就是.class字节码。所以通过学习字节码的规范和规则能提升我们对代码执行过程的理解。

这里恶补一下字节码相关的基础知识。

我们打开.class文件,发现字节码都是十六进制的编码。

字节码的组成有以下部分,正入上图所示,十六进制的字节码中就包含这些部分 。如下图所示。

1.魔数:如图所示,cafebabe就是java字节码的魔术,这个数字是用java之父,詹姆斯高斯林指定的,其含义 就是java的咖啡bean吧。

2.版本号:因为java有不同的版本,所以在java字节码中也有标记。0000 0034两个字节就表示java1.8版本。

3.常量池:在java代码中一般会有很多常量,比如我们System.out.println(”ok”),这里用引号写死在代码 中的就是常量。java在编译的时候就会将这些常量罗列出来,形成常量池。在调用的时候从常量池中获取这些值。因为对于代码而言,常量的数量是可以确定的,所以这块常量池用了一个字节来表示常量池的大小。这里的0027就表示该类中常量的个数。这里表示39,扣除本身,这里表示有38个常量。如下图所示即是该类的常量。

对于这些常量,都用过一种数据结构进行保存。tag+length+data。也就是识别符号+数据长度+真实的数据的方式。比如这里

01 0001 01表示tag为1,长度为1,值为1的常量。这里的表示的常量Constant_utf8_info.这里我们知道常量池主要存储一些常量。下图为java的常量和相关的tag、length以及data的说明。

4.访问标志ÿ

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值