字节码(Byte-code)是一种包含执行程序,由一序列 op 代码/数据对组成的二进制文件,是一种中间码。字节是电脑里的数据量单位。
image.png
image.png
首先讲一下魔数占四个字节对应 上图demo.class 0Xcafe babe表示java的class文件。好奇的你发现 cafe babe 约等于下张图
image.png
对应demo 0X0000 0033 其中前面的0000是次版本号,后面的0033是主版本号。通过进制转换得到的是次版本号为0,主版本号为51
紧接着主版本号之后的就是常量池入口。常量池是Class文件中的资源仓库,在接下来的内容中我们会发现很多地方会涉及,如Class Name,Interfaces等。常量池中主要存储2大类常量:字面量和符号引用。字面量如文本字符串,java中声明为final的常量值等等,而符号引用如类和接口的全局限定名,字段的名称和描述符,方法的名称和描述符。
image.png
Constant #1 (一共有20个常量,这是第一个,以此类推…) 0x0a-:从常量类型表中我们发现,第一个数据均是u1类型的tag,16进制的0a是十进制的10,对应表中的MethodRef_info。 0x-00 04-:Class_info索引项#4 0x-00 11-:NameAndType索引项#17
访问标志信息包括该Class文件是类还是接口,是否被定义成public,是否是abstract,如果是类,是否被声明成final。通过上面的源代码,我们知道该文件是类并且是public。
Access_Flag.png
后续可以参考java程序如何按照字节码翻译