【面试】class文件结构
2025/11/16 10:43:50
来源:https://blog.csdn.net/qq_32088869/article/details/139971232
浏览:
次
关键词:【面试】class文件结构
目录 1. 说明 2. 魔数 3. 版本号 4. 常量池 5. 访问标志 6. 类索引、父类索引和接口索引集合 7.字段表集合、方法表集合和属性表集合
1. 说明
1.class文件的结构并不是一成不变的,随着java虚拟机的不断发展,会对class文件结构做出一些调整。但基本结构和框架是非常稳定的。 2.class文件的总体结构:魔数、版本号、常量池、类的访问标识(标志、控制权限)、类名(类索引)、超类(父类索引)、接口(接口索引集合)、字段(字段表集合)、方法(方法表集合)、属性(属性表集合)。
2. 魔数
1.class文件的标志。 2.文件开始的4个字节的无符号整数称为魔数(magic number),其值为0xCAFEBABE(十六进制表示)。 3.魔数的唯一作用是确定这个文件是否为一个能被Java虚拟机接受的有效合法的Class文件。 4.魔数是Class文件的标识符。 5.如果一个Class文件不以0xCAFFBABE开头,虚拟机在进行文件校验的时候会抛出错误:Error: A JNI error has occured, please check your installation and try again … Incompatible magic value … in class file …
3. 版本号
1.紧接着魔数的4个字节是Class文件的版本号,包括次版本号(Minor Version,占2个字节)和主版本号(Major Version,占2个字节)。 2.版本号用于标识Class文件的兼容性,高版本的JDK能向下兼容以前版本的Class文件,但不能运行以后版本的Class文件。
4. 常量池
1.常量池容量计数值:紧接着版本号的2个字节代表常量池容量计数值(constant_pool_count),表示常量池中有多少项常量。 2.常量池容量计数值是从1开始的。 3.常量池内容:常量池是Class文件结构中与其他项目关联最多的数据,也是占用Class文件空间最大的数据项目之一。 4.常量池主要存放两大类常量:字面量(Literal)和符号引用(Symbolic References)。 5.字面量比较接近于Java语言层面的常量概念,如文本字符串、被声明为final的常量值等。 6.符号引用则属于编译原理方面的概念,主要包括类和接口的全限定名、字段的名称和描述符、方法的名称和描述符等。
5. 访问标志
1.常量池之后是访问标志(access_flags),占2个字节。 2.这个标志用于识别一些类或接口层次的访问信息,如这个Class是类还是接口、是否定义为public类型、是否定义为abstract类型等。 3.如果是类的话,是否被声明为final等。 4.类的访问权限通常为ACC_开头的常量。
6. 类索引、父类索引和接口索引集合
1.类索引:用于确定这个类的全限定名。 2.父类索引:用于确定这个类的父类的全限定名。由于Java语言不允许多重继承,所以父类索引只有一个。除了java.lang.Object之外,所有的Java类都有父类,因此除了java.lang.Object外,所有Java类的父类索引都不为0。 3.接口索引集合:用于描述这个类实现了哪些接口。这些被实现的接口将按implements关键字(如果这个Class文件表示的是一个接口,则应当是extends关键字)后的接口顺序从左到右排列在接口索引集合中。
7.字段表集合、方法表集合和属性表集合
1.字段表集合:用于描述接口或类中声明的变量(不包括在方法内部声明的局部变量)。 2.方法表集合:其结构与字段表类似,用于描述接口或类中声明的方法。 3.属性表集合:在Class文件、字段表、方法表中都可以携带自己的属性表集合,用于描述某些场景专有的信息。属性表集合的限制稍微宽松一些,不再要求各个属性表具有严格顺序。