目录
[1. 常量池计数器](#1. 常量池计数器)
[2. 常量池](#2. 常量池)
[3. 访问标识](#3. 访问标识)
[4. 类索引、父类索引、接口索引集合](#4. 类索引、父类索引、接口索引集合)
[5. 字段表集合](#5. 字段表集合)
一、前端编译器
前端编译器的主要任务就是负责将符合Java语法规范的Java代码转换为符合JVM规范的字节码文件。

二、Class文件结构
任何一个Class文件都对应着唯一一个类或者接口的定义信息,Class文件实际上不一定以磁盘文件的形式存在(也可以通过网络进行传输)。Class文件是一组以8个字节为基础单位的二进制流。
Class的结构不像XML等语言,由于没有任何分隔符号,所以其中的数据项都是被严格限定的,哪个字节代表什么含义,长度是多少,先后顺序如何,都不允许改变。
Class文件的总体结构如下:魔数、Class文件版本、常量池、访问标志、索引集合、字段表集合、方法表集合、属性表集合。
在·
1. 常量池计数器

2. 常量池

常量池可以理解为Class文件中的资源仓库,也是占用Class文件空间最大的数据项目之一。
常量池中为什么要包含这些内容?
Java代码在进行编译的时候,并不像C和C++有"连接"这一步骤,而是在虚拟机加载Class文件进行动态链接。在Class文件中不会保存方法、字段的最终内存信息,因此这些方法和字段只能保存为符号引用,在虚拟机运行时再转换为真实的内存信息。
3. 访问标识

4. 类索引、父类索引、接口索引集合
类索引是指向常量池的索引,提供了当前类的全限定名;父类索引也是指向常量池的索引,提供了父类的全限定名。

5. 字段表集合
字段表集合中包括字段计数器 和字段表。

6.方法表集合
方法表集合与字段表集合在设计上是差不多的。包含方法计数器 和方法表。

7.总结
对于Class文件的分析可以用下面的几张图来进行总结。
下面这张图展示了魔数 (cafe babe),这是Class文件的表示;以及主版本和副版本 ,两者结合表示当前Class文件的版本号。常量池计数器存储了该常量池中的常量个数;后面每一个常量的开头都有一个标识Tag,表明了该常量是个什么类型。

下面这张图包含了该类的访问标识等信息。当前类索引 和父类索引 都是指向常量池的索引,常量池中包含了当前类和父类的相关信息,根据索引才可以查询到相关信息。黄色背景指的是实现接口的计数器,因为当前类并没有实现接口,所以计数器中数值为0.

下面这张图给出了该类中字段和方法的信息。字段计数器 表示该类中有多少个字段(即类中的成员变量);字段访问标识表示 该字段的修饰符属性(即public、final等),图中字段访问标识为2,则查表即可得到相关信息;字段名索引 和字段描述符索引 都要去常量池中进行查找;字段的属性计数器表示当前字段有多少个属性。方法的描述信息与字段类似。只不过图中有两个方法。
对于字段和方法的属性,可以简单地理解为它们的特征信息,即它们在类中所具有的修饰符、类型、名称、作用范围、行为特征等。
