字节码文件结构是一组8位字节为基础的二进制流,个数据项目严格按照顺序排列,美誉任何的分隔符,有两种最基本的数据类型来表示字节码文件格式:无符号数 、 表。
整个字节码文件本质上就是一张表,由下面几个部分组成:
一个完整的表划分为七个部分,这七个部分组成一个完整的class字节码文件:
· 魔数与Class文件版本
· 常量池
· 访问标志
· 类索引、父类索引、接口索引
· 字段表集合
· 方法表集合
· 属性表集合
1、魔数与Class文件版本
各版本JDK的十六进制版本号信息:
2、常量池 u2
紧跟版本信息之后的是常量池信息,其中2个字节表示常量池个数,其后不定长数据表示常量池的具体信息。
Java虚拟机规范中一共有14cp_info类型的表结构
上面的cp_info表结构有不同的数据结构:
tips:javap -verbose 名称.class 时,控制台会打印出该class文件的构成信息。
3、访问标志 u2
在常量池结束之后,紧接着的两个字节代表类或者接口的访问标记。字节码文件中的标志是多个值进行或运算的结果。
4、类索引 u2、父类索引 u2、接口索引 u2
在访问标记之后,则是类索引、父类索引、接口索引的数据。
类索引:用于确定该类的全限定名,值是几就指向常量池的第几个常量;
父类索引:用于确定这个类的父类的全限定名,值是几就指向常量池的第几个常量;
接口索引: 接口索引集合就用来描述哪个类实现了哪些接口,这些被实现的接口将按 implements 语句(如果这个类本身就是一个 接口,则应当是extends语句)后的接口顺序从左到右排列在接口索引集合中。对于接口索引集合,入口第一项是 u2类 型的数据为接口计数器(interfaces_count),表示索引表的容量,而在接口计数器后则紧跟着所有的接口信息。
5、字段表集合 u2
描述接口或者类中声明的变量。这里说的字段是类的变量和实例级的变量,不包括方法中的变量。
field_info表数据结构:
6、方法表集合 u2
在字段表后饿2个字节是一个方法计数器,表示类中有几个方法,后面是具体的方法数据。
method_info表数据结构: