什么是Class文件?

  • Class文件是一组以8字节为单位的字节流,各个数据项目按顺序紧凑排列
  • Class文件格式只有两种类型:无符号数和表
    • 无符号数是基本数据类型,如u1,u2,u4,u8代表1个字节,2个字节,4个字节,8个字节的无符号数
    • 表是由多个无符号数和其他表组成的复合数据结构,一般名称以_info结尾

具体说一下Class文件的结构?

  • 首先头4个字节是魔数,有这4个字节的才是Class文件
  • 后面第5、6字节是次版本号,第7、8字节是主版本号
  • 第9字节开始是常量池,每个常量开头第一个字节表示常量池的某个项目标记,按照标记确定是哪个常量类型,第二个字节是长度,根据长度往后找这么多个字节表示常量
    • image.png
  • 常量池结束后两个字节代表访问标志,包括这个Class是类还是接口,是不是public,是不是abstract等
    • image.png
  • 访问标志之后是类索引、父类索引和接口索引集合
  • 之后是字段表集合,用来描述类/接口中的变量,包括各种修饰符和引用常量池的常量
  • 然后是方法表集合,和字段表几乎一样,用来描述类/接口中的方法
  • 最后是属性表集合,**字段表和方法表都可以拥有自己的属性表集合,例如栈深度、变量存储空间、行号等**