【笔记】深入理解 java 虚拟机---Class的文件结构。

2018-01-02  本文已影响0人  张航_8ee7

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。从左到右。

上一篇下一篇

猜你喜欢

热点阅读