什么是字节码?

作者: 奔跑的蛙牛 | 来源:发表于2018-08-26 18:08 被阅读374次

    什么是字节码

    字节码(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程序如何按照字节码翻译

    相关文章

      网友评论

        本文标题:什么是字节码?

        本文链接:https://www.haomeiwen.com/subject/pcioiftx.html