【笔记】深入理解 java 虚拟机---Class的文件结构。
Class 文件是一组以8位字节为基础单位的二进制流。
类似下图,0-3是一组。4-7是一组。
Class 文件是类似与c语言结构的伪结构来存储数据的。由两种数据类型组成:
【1】 无符号数。 基本数据类型。以u1,u2,u4,u8。来代表1个字节、2个字节、4个字节、8个字节的无符号数。无符号数可以用来表示,数字,索引引用,数量值,字符串值。
【2】表。以多个无符号数或者表组成的复合型数据结构。已_info结尾。class 文件本质就是一张表。
1 魔数 与class 版本。
魔数就是文件开头的4个字节,如上面的 cafebabe,来确定文件格式。
https://www.cnblogs.com/mq0036/p/3912355.html
摘要几个。
JPEG (jpg),文件头:FFD8FF
PNG (png),文件头:89504E47
GIF (gif),文件头:47494638
TIFF (tif),文件头:49492A00
Windows Bitmap (bmp),文件头
接着的 00 00 00 34 ,分别代表,次版本号(00 00)和主板本号(00 34)。
2 常量池
版本过后紧接着 就是常量池。先由一个u2 类型的数据,保存该类的常量池大小。 如上8-9(00 1d),换成 10进制是 29。 也就是 有28个常量, 索引 范围是 1-28。
常量池 放的是 字面量和 符号引用。
字面量 : 字符串,修饰为final的常量。
符号引用:类和接口的全限定名。 字段名称和描述符。 方法名称和描述符。
常量池中为什么要包含这些内容?
class文件不会保各个方法 字段的最终内存布局信息,因为这些方法,字段,不经过运行期转换无法得到真正的内存信息。
虚拟机在运行时,会从常量池获得对应的符号引用,再在类创建时或运行时解析,翻译到具体的内存入口。
常量池的一共有 14 种常量。如下:
其中 1-8 是 字面量。 9-18 是 符号引用。
上述的14种常量,每一种都有自己的数据结构。
下面 有一片博客专门介绍 如何分析 : 生成 的 class 文件。
https://www.jianshu.com/p/4224b896516e
3 访问标志
根据上面的表格,测试类的访问标志为ACC_PUBLIC | ACC_SUPER = 0x0001 | 0x0020 =1 | 32 = [00000000][00000001] | [00000000][00010000] = [00000000][00010001] = 33 = 0x0021 。
是 普通类,不是接口、枚举或注解、被public 声明但没有声明 final 和 abstract ,并且使用了 1.2 jdk 作编辑器。
类索引,接口索引集合,父类索引。
0003 是 类索引 ,0004 是 父类 索引,0001 是接口集合大小,后面的 0005 是实现的接口。占一个 u2。从左到右。