Class文件结构(更新中)

Class文件是一组以8位字节为单位的二进制流,当遇见需要占用8位字节以上空间的数据项时,则会按照高位在前的方式分割成若干个8位字节进行存储。

格式,采用伪结构,只有两种数据结构:无符号数和表。

无符号数:

表:由多个无符号数或其他表作为数据项构成的复合数据类型,整个Class文件本质上就是一张表

数据项:

魔数(magic)

Class文件的头4个字节,作用是确定此文件是否为虚拟机可接受的class文件

次版本号(Minor Version)

5、6字节

主版本(Major Version)

7、8字节

常量池容量计数值(constant_pool_count)

2个字节

常量池(constant_pool)

大小不固定

字面量

Java语言层面的常量:文本字符串、final

符号引用

编译原理层面的概念

类和接口的全限定名(引入的类和接口,而不是此类或接口的

字段的名称和描述符(描述符即修饰符)

方法的名称和描述符

java在进行javac编译时,没有“连接”操作,而是在虚拟机加载class文件时动态连接,也就是说class文件不会包含各个方法、字段的最终内存布局信息。

访问标志(access_flag)

2个字节

类或者接口层次的访问信息,如这个class是类还是接口,是否是public

类索引(this_class)

u2

确定此类全限定名(通过索引能查出全限定名)

父索引(super_class)

u2

确定父类全限定名

接口计数器(interfaces_count)

u2

代表接口索引表的容量

接口索引集合(interfaces)

u2类型数据集合

此类实现了那些接口,按照implements后的接口顺序从左到右排列

字段表集合(field_info)

接口或类中的变量的描述,包括类级变量和实例级变量。

内容:

作用域(public、private、protected)、实例变量还是类变量、可变性、并发可见性、字段数据类型、字段名称

对于修饰符,属于布尔值,用标志位表示

对于字段名称,其实是通过索引引用常量池中的常量的简单名称

方法表集合

属性表集合

原文地址:https://www.cnblogs.com/yanze/p/9811478.html