这一次,彻底弄懂 Java 字节码文件!(11)

以此类推 , 最终都能通过十六进制字节码并结合字节码结构总表分析在常量池中找到对应的字节码内容 。

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

上述MyTest1类十六进制字节码中的位置:0x 00 21 这个 0x 00 21 是访问标志结构表中的 0x 00 20 和 0x 00 01 的并集 , 表示ACC_PUBLIC与ACC_SUPER 。 public class com .dskj .jvm .bytecode .MyTest1 ... flags : ACC_PUBLIC ACC_SUPER

访问标志之后的是This Class Name , 对应十六进制为0x 00 03

在常量池项目类型中查找: #3 = Class #22 //com/dskj/jvm/bytecode/MyTest1

This Class Name之后的是Super Class Name , 对应十六进制为0x 00 04

在常量池项目类型中查找: #4 = Class #23 //java/lang/Object

I nterfaces

接口包括两部分 , 第一个是interfaces_count(接口个数) , 第二部分interfaces(接口名) 。 当前这个类对应的十六进制:00 00 转换为十进制仍然是0 , 说明当前这个类是没有实现任何接口的 。 因此 , 这个interfaces接口表就不会再出现了 。 如果接口数量interfaces_count大于等于1的话 , 那么这个interfaces接口表是存在的 。 4.5 字段表 Fields 字段包括两部分 , 第一个是fields_count(字段个数) , 第二部分fields(字段名) 。 当前这个类对应的十六进制:00 01 转换为十进制值为1 , 说明这个类内部有一个字段 。 字段表集合 字段表用于描述类和接口中声明的变量 。 这里的字段包含了类级别变量以及实例变量 , 但是不包括方法内部声明的局部变量 。 字段表结构:

推荐阅读