java字节码

java字节码

起男 1,159 2020-11-03

java字节码

魔数(Magic)

所有的.class文件的前四个字节都是魔数,魔数的固定值为:CAFEBABE。

jvm可以根据文件的开头来判断这个文件是否可能是一个.class文件,如果是,才会继续进行之后的操作

版本号(Version)

版本号为魔数之后的4个字节,前两个字符表示次版本号(Minor Version),后两个字节表示主版本号(Major Version)

常量池(constant_pool)

紧接着主版本号之后的字节为常量池入口

常量池中存储两类常量:字面量和符号引用

  • 字面量:代码中声明为final的常量值
  • 符号引用:类和接口的全限定名、字段的名称和描述符

常量池分为两部分:

  • 常量池计数器(constant_pool_count):由于常量的数量不固定,所以需要先放置两个字节来表示常量池容量计数值
  • 常量池数据区:数据区是由(constant_pool_count-1)个cp_info结构组成,一个cp_info结构对应一个常量

共有14种类型的cp_info,每种类型的结构都是固定的

访问标志(access_flag)

常量池结束之后的两个字节,描述该class是类还是接口,以及是否被public、abstract、final等修饰符修饰

当前类索引(this_class)

访问标志后的两个字节,描述的是当前类的全限定名。

这两个字节保存的值为常量池中的索引值,根据索引值就能在常量池种找到这个类的全限定名

父类索引(super_class)

当前类索引后的两个字节,描述父类的全限定名

同上,保存的也是常量池中的索引值

接口索引(interfaces)

父类索引后的两个字节的接口计数器,描述了该类或父类实现的接口数量

紧接着的n个字节是所有接口名称的字符串常量的索引值

字段表(fields)

字段表用于描述类和接口中声明的变量,包含类级别的变量以及实例变量,但是不包含方法内部声明的局部变量

字段表分为两部分:

  • 第一部分为两个字节,描述字段个数field_count
  • 第二部分是每个字段的详细信息fields_info

方法表(methods)

字段表结束后为方法表,方法表也是由两部分组成:

  • 第一部分为两个字节描述方法的个数
  • 第二部分为每个方法的详细信息,包括方法的访问标志、方法名、方法的描述符以及方法的属性

附加属性(attributes)

字节码的最后一部分,该项存放了在该文件中类或接口所定义属性的基本信息