一、class类文件的结构
1、常量池
常量池:用于存放编译期生成的各种字面量和符号引用,这部分内容分将在类加载后进入方法区的运行时常量中存放。
字面量:比较接近java语言层面的常量概念,如文本字符串、声明为final的常量值等。
符号引用:属于编译原理方面的概念,包括了下面三类常量:
A、类和接口的全限定名 B、字段的名称和描述符 C、方法的名称和描述符
2、访问标志
用于识别一些类或者接口层次的访问信息,包括:这个Class是类还是接口;是否定义为public类型;是否定义为abstract类型;如果是类的话,是否被声明为final等。
3、类索引、父类索引与接口索引集合
类索引和父类索引都是一个u2类型的数据,而接口索引集合是一组u2类型的数据的集合,Class文件中由这三项数据来确定这个类的继承关系。
类索引:用于确定这个类的全限定名
父类索引:用于确定这个类的父类的全限定名
接口索引集合:用来描述这个类实现了哪些接口,这些被实现的接口将按implement语句后的接口顺序从左到右排列在接口索引集合中。
4、字段表集合
字段表:用于描述接口或者类中声明的变量。字段包括类级变量以及实例级变量,但不包括在方法内部声明局部变量。
描述符:用来描述字段的数据类型、方法的参数列表(包括数量、类型以及顺序)和返回值
5、字节码指令
Java虚拟机的指令由一个字节长度、代表着某种指定操作含义的数字(称为操作码)以及跟随其后的零至多个代表此操作所需要参数(称为操作数)而构成。字节码指令集是一种具有鲜明特点、优劣势很突出的指令集架构。
6、加载和存储指令
加载和存储指令用于将数据在栈针中的局部变量表和操作数栈之间来回传输,这类指令包括如下内容:
(1)、将一个局部变量加载到操作栈
(2)、将一个数值从操作数栈存储到局部变量表
(3)、将一个常量加载到操作数栈
(4)、扩充局部变量表的访问索引的指令:wide
存储数据的操作数栈和局部变量表主要就是由加载和存储指令进行操作,除此之外,还有少量指令,如访问对象的字段或数组元素的指令也会向操作数栈传输数据。
7、运算指令
运算或算术指令用于对两个操作数栈上的值进行某种特定运算,并把结果重新存入到操作栈顶。大体上算术指令可以分为两种:对整形数据进行运算的指令与对浮点型数据进行运算的指令。
8、类型转换指令
类型转换指令可以将两种不同的数值类型进行相互转换,这些转换操作一般用于实现用户代码中的显式类型转换操作。