JVM学习笔记(6)之字节码文件剖析2

上一篇字节码文件剖析完了常量池表,接下去我们剖析字节码整体结构的剩下的内容,如下图所示

Java字节码整体结构剖析图

  1. access_flags(访问标志),类型是u2,说明长度占据2个字节,数量是1

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

在这里插入图片描述

可以看到(下图)从我标记的开始,是访问标志开始的信息,是00 21,00 21=0x00 20|0x00 01,根据访问标志图00 20是 ACC_SUPER,00 01是ACC_PUBLIC,说明是public的、可被继承的

在这里插入图片描述

  1. this_class(类名),类型是u2,长度占据2个字节,数量是1

访问标记后面2个字节是00 03,找到常量池#3号元素

在这里插入图片描述

发现类的限定名为com/zh/bytecode/MyTest1

  1. super_class(父类名),类型是u2,占2个字节,数量是1
    2个字节是00 04,找到常量池#4号元素,找到父类是java/lang/Object,因为我们并没有指定父类,所以java给我们一个所有类的父类

  2. interfaces_count(接口个数),占2个字节,数量是1

两个字节是00 00,说明接口数量为0

  1. interfaces(接口名),占2个字节,数量是interfaces_count,如果interface_count是0,则不会出现interfaces的信息

接口数量为0,所以接口名信息就不存在

  1. fields_count(域个数),占2个字节,数量是1

2个字节是00 01,说明域数量为1,我们在实例中定义了一个int类型的a

  1. fields(域的表),是field_info类型,跟常量池一样,是不确定的长度,数量是fields_count,同样如果fields_count为0,则fields信息不会存在

字段表集合:用于描述类和接口中声明的变量。这里的字段包含了类级别变量以及实例变量,但是不包括方法内声明的局部变量,字段表集合的结构跟常量池一样,有自己特殊的结构,如图所示

在这里插入图片描述
access_flag是00 02,表示的是private,name_index是00 05,找到常量池中#5号元素,可以看到是a,而descriptor_index是00 06,找到#6号元素,可以看到是I,代表着是一个int类型,变量名为a的变量,attribute_count是00 00,代表属性数量为0,所以attribute_info的信息也就不存在了

  1. methods_count(方法的个数),占2个字节,数量是1

两个字节是00 03,说明方法的数量是3个,get+set+默认的构造方法

  1. methods(方法表),method_info类型,数量是methods_count

在这里插入图片描述

第一个方法:access_flag是00 01,代表public。name_index是00 07,指向#7号常量池元素,可以看到是,代表是构造方法。descriptor_index是00 08,指向#8号元素,可以看到()V,代表返回值是void的空参方法。attribute_count是00 01代表数量是1。attribute_info(方法属性结构图):attribute_name_index是00 09,对应常量池中的#9号元素,对应的是Code,Code是方法的执行代码信息。attribute_length是00 38,换算成十进制是56,说明Code会占有56个字节的长度作为Code的值。

Code结构:

  • attribute_length表示attribute所包含的字节数,不包含attribute_name_index和attribute_length字段
  • max_stack表示这个方法运行的任何时刻所能达到的操作数栈的最大深度
  • max_locals表示方法执行期间创建的局部变量的树木,包含用来表示传入的局部变量
  • code_length表示该方法所包含的字节码的字节数以及具体的指令吗
  • 具体字节码即是该方法被调用时,虚拟机所执行的字节码
  • exception_table是存放的处理异常的信息
  • 每个exception_table表项由start_pc,end_pc,handler_pc,catch_type组成

在这里插入图片描述

  1. attributes_count(附加属性的个数),占2个字节,数量是1

  2. attributes(附加属性的表),attribute_info类型,数量是attributes_count

补充:Class字节码中有两种数据类型

字节数据直接量:这是基本的数据类型。共细分为u1、u2、u4、u8四种,分别代表连续的1个字节、2个字节、4个字节、8个字节组成的整体数据

表(数组):表是由多个基本数据或其他表,按照既定顺序组成的大的数据集合。表是有结构的,它的结构体现在:组成表的成分所在的位置和顺序都是已经严格定义好的。

ps:由于方法属性剖析相对比较复杂,故我把剩下的内容分到下篇讲解,一下子看太多也不是很好理解

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值