JAVA类文件结构

class类的结构

如图,单位是字节u1代表1个字节。

avator

魔术和版本号

文件前4个字节代表这是个java文件固定CAFEBABE
第5、6字节代表此版本号,7、8字节代表主版本号,版本号有向下兼容性

常量池

紧接着这就是常量池了,常量池的前俩个字节偏移量是0x00000008,代表常量的个数,和java其他的数据表示方法不一样,常量池下标是从1开始,(比如数字是22,常量21个索引范围是1~21个)常量池有14种数据类型,每一个常量的第一位tag(长度u1)就是它类型,见下图:
avator

具体数据个数如下:
avator

可以通过javap命令查看类的常量池 javap-verbose TestClass

访问标志

是一个标志位,标志类是否是public的是interface还是class是否声明为final等,具体如下:

avator

计算方式采用“|”

类索引、父类索引和接口索引集合

类索引、父类索引长度都是8,指向常量表的索引,接口索引是一组指向常量表的索引。
除了Object类,父类索引都不是0。

字段表、方法表集合

包括了

  • 访问标志(access_flags):public、private等,长度8个字节
  • 名称索引(name_index):指向常量表
  • 修饰符所以(descripor_index):用简短方法表述字符比如java.lang.String[],描述为[Ljava/lang/String
  • 属性集合表count(attribute_count):长度8个字节,代表属性长度
  • 属性信息(attribute_info):长度8个字节,数量attribute_count,代表属性信息。方法有固定的属性Code

    附:
    字段表结构
    avator
    字段access_flags
    avator
    方法表访问标志位
    avator
    demo
    avator

属性表

avator
avator

java的自己码指令

jvm的指令码是面试操作栈的,它的指令由1个字节的代码特殊含义的操作码以及后面0到多个操作参数组成。由于操作码是1个字节所以java最多有255个操作码。

感觉jvm是讲数据读到操作栈中操作,在写回栈帧的局部变量中。