JVM_类文件结构
class类文件的结构
Class文件是一组以8为字节为基础单位的二进制流,各数据项目严格按照顺序紧凑的排列在Class文件之中,中间没有添加任何分隔符。当遇到需要占用8位字节以上空间的数据项时,则会按照高位在前的方式分割成若干个8为字节进行存储。
Class中的两种数据类型:
- 无符号数:属于基本的数据类型,用u1、u2、u4、u8分别代表1个字节、2个字节、4个字节和8个字节的无符号数,无符号数可以用来描述数字,索引引用、数量值或按照UTF-8编码构成的字符串值。
- 表:多个无符号数或其他作为数据项构成的复合数据类型,所有表都习惯性地以"__info"结尾。
无论是无符号数还是表,当需要描述同一类型但数量不定的多个数据时,经常会使用一个前置的容量计数器加若干个连续的数据项的形式,这时称这一系列连续的某一类型的数据为某一类型的集合。
类型 | 名称 | 数量 |
---|---|---|
u4 | magic | 1 |
u2 | minor_version | 1 |
u2 | major_version | 1 |
u2 | constant_pool_count | 1 |
cp_info | constant_pool | constant_pool_count - 1 |
u2 | access_flags | 1 |
u2 | this_class | 1 |
u2 | super_class | 1 |
u2 | interfaces_count | 1 |
u2 | interfaces | interfaces_count |
u2 | fields_count | 1 |
field_info | fields | fields_count |
u2 | methods_count | 1 |
method_info | methods | methods_count |
u2 | attribute_count | 1 |
attribute_info | attributes | attributes_count |
采用如下代码进行分析
public class Hello {
public static void main(String[] args) {
System.out.println("hello");
}
}
魔数与Class文件的版本
Class文件的头4个字节成为魔数(Magic Number),它的作用是确定这个文件是否是一个能被虚拟机接受的Class文件。
使用魔数而不使用扩展名来进行识别,是要是基于安全的考虑,因为文件的后缀名可以随意改动。
文件格式的制定者可以自定义的选择魔数值,只要这个值还没有被广泛的使用过同时不引起混淆。