前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >什么是字节码?

什么是字节码?

作者头像
用户2436820
发布2018-09-05 10:22:58
1.9K1
发布2018-09-05 10:22:58
举报
文章被收录于专栏:奔跑的蛙牛技术博客

什么是字节码

字节码(Byte-code)是一种包含执行程序,由一序列 op 代码/数据对组成的二进制文件,是一种中间码。字节是电脑里的数据量单位。

字节码文件展示

image.png

首先了解一张图 java字节码总览图

image.png

魔数 四个字节

首先讲一下魔数占四个字节对应 上图demo.class 0Xcafe babe表示java的class文件。好奇的你发现 cafe babe 约等于下张图

image.png

版本号 4个字节

对应demo 0X0000 0033 其中前面的0000是次版本号,后面的0033是主版本号。通过进制转换得到的是次版本号为0,主版本号为51

常量池

紧接着主版本号之后的就是常量池入口。常量池是Class文件中的资源仓库,在接下来的内容中我们会发现很多地方会涉及,如Class Name,Interfaces等。常量池中主要存储2大类常量:字面量和符号引用。字面量如文本字符串,java中声明为final的常量值等等,而符号引用如类和接口的全局限定名,字段的名称和描述符,方法的名称和描述符。

  • 0×0015:由于常量池的数量不固定(n+2),所以需要在常量池的入口处放置一项u2类型的数据代表常量池数量。因此该16进制是21,表示有20项常量,索引范围为1~20。明明是21,为何是20呢?因为Class文件格式规定,设计者就讲第0项保留出来了,以备后患。从这里我们知道接下来我们需要翻译出20项常量。

image.png

Constant #1 (一共有20个常量,这是第一个,以此类推…) 0x0a-:从常量类型表中我们发现,第一个数据均是u1类型的tag,16进制的0a是十进制的10,对应表中的MethodRef_info。 0x-00 04-:Class_info索引项#4 0x-00 11-:NameAndType索引项#17

Access_Flag 访问标志

访问标志信息包括该Class文件是类还是接口,是否被定义成public,是否是abstract,如果是类,是否被声明成final。通过上面的源代码,我们知道该文件是类并且是public。

Access_Flag.png

后续可以参考java程序如何按照字节码翻译

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018.08.26 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 什么是字节码
  • 字节码文件展示
  • 首先了解一张图 java字节码总览图
    • 魔数 四个字节
      • 版本号 4个字节
        • 常量池
        • Access_Flag 访问标志
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档