计算机只认识0和1,所以我们写的程序需要经编译器翻译成由0和1构成的二进制格式才能由计算机执行。
1.概述
java文件会被编译为class文件,而class文件是一组以8位字节为基础单位的二进制流。
在Class文件结构中,有两种数据类型:无符号数和表。无符号数主要有以下四种类型:
类型 | 字节数 |
---|---|
u1 | 1 |
u2 | 2 |
u4 | 4 |
u8 | 8 |
表就是由多个无符号数,以及其他的表组成的复杂的数据类型。
2.魔数
每个Class文件的头4个字节称为魔数,用来确定这个文件是不是class文件。这四个字节的值为0xCAFEBABE(咖啡宝贝)。
3.主版本和次版本
在魔数后面的两个字节是次版本号,为0x0000(为第五个和第六个字节),之后的为主版本号,为0x0032(为第七个和第八个字节)。
注:高版本的JDK能向下兼容低版本的Class文件,但不能运行更高版本的Class文件
4.常量池
紧接着主次版本号之后的是常量池。首先,是常量池容量计数值,是u2类型的数据。如图所示,为0x0024,及十进制的36,代表了有35个常量(1~35,0不算)。
常量池的第一项常量,0x0A代表了这个常量的数据类型,即10对应了CONSTANT_Methodref_info。
在下方的表中找出CONSTANT_Methodref_info对应的结构,发现,该常量由u1,u2,u2个字节组成。