如图所示,class文件其实就是一些二进制,注意是以16进制保存
前4字节代表的是魔数,就是cafebabe,后面两个字节代表次版本,再两个字节代表版本号,再后面就是很重要的内容!分别进行阐述
- 常量池:2个字节的计数器 再加上 一个复合表结构
- 访问标志 一般是以ACC开头
例如:ACC_PUBLIC等 如果public+final 那么就要将对应的两个值进行或运算
3.类索引、父类索引、接口索引
类索引和父类索引都是一个u2类型的数据,因为可以对多个接口进行实现,所以接口索引集合是一组u2类型的数据的集合 ,注意前面也应该有计数器
4.字段表
主要是对类或接口中的变量进行描述(但是不包括局部变量)
访问标志就是类似于 public等,字段名就是字段的名字,也可以理解为变量名,描述符就是它的类型,例如J、I等
属性集合 记录了初始值(必须是常量final等)、注释信息
5.方法表
也是2字节的计数器加上方法表构成
属性表里面最常见的就是code属性,记录了该方法的全部操作指令
注意 code属性里面还有两个子属性:LineNumberTable,LocalVariableTable
LineNumberTable:记录了java源文件行号与字节码文件偏移量之间的对应关系
LocalVariableTable:记录了用来描述栈帧的局部变量表中变量与java源码中变量的对应关系,也就是记录了各变量的作用范围(以行数来体现)
6.属性表
记录了class文件对应的一些信息,例如源文件名称等等。



