字节码文件的组成

 
字节码常用工具:
  1. javap命令
  1. Jclasslib字节码插件
  1. Arthas

一. 打开字节码文件

  • 字节码文件中保存了源代码编译之后的内容,以二进制的方式存储,可以使用NotePad++使用16进制插件查看class文件
  • 使用jclasslib工等具查看字节码文件
 

二. 字节码文件的组成

notion image

1.基本信息:

notion image

( 1 ).Magic魔数

  • 文件是无法通过文件拓展名来确定文件类型的(拓展名可以随意修改)
  • 软件使用文件的头几个字节(文件头)去校验文件的类型,如果软件不支持该类型则出错
  • Java字节码文件中,将文件头称为magic魔数
notion image

( 2 ).主副版号

  • 主副版本号指的是编译字节码文件的JDK版本号,主版本号用来表示大版本号,JDK1.0-1.1使用了45.0-45.3,JDK1.2是46之后每升级一个大版本就加1;副版本号是当主版本号相同时作为区分不同 版本的标识,一般只需要关心主版本号
  • 版本号的作用主要就是判断当前字节码文件的版本和运行时的JDK是否兼容

( 3 ).基础信息汇总

  1. Magic魔数:固定位 0xCAFEBABE不会变
  1. 主副版本号 : 验证字节码文件的版本
  1. 访问标识: 标识是类还是接口、注解、枚举、模块 和 public final abstract
  1. 类、父类、接口索引: 通过这些索引可以找到 类、父类、接口的信息
 

2.常量池:

  • 字节码文件常量池的作用:避免相同的内容重复定义,节省空间
  • 常量池中的数据都有一个编号,从1开始 。在字段或者字节码指令中通过编号可以快速找到对应数据
  • 字节码指令中通过编号引用到常量池的过程称之为符号引用;
 

3.方法:

  • 字节码中的方法区域是存放字节码指令的核心位置 , 字节码指令的内容存放在方法的Code属性中
notion image
  • 操作数栈是临时存放数据的地方 , 局部变量表是存放方法中的局部变量的位置
notion image
 
 
 

总结:

  1. 如何查看字节码文件
      • 本地文件可以使用jclasslib工具查看 , 开发环境使用jclasslib插件
      • 服务器上文件使用javap命令
      • 通过Arthas的dump命令导出字节码文件再查看本地文件或者直接使用jad命令反编译出源码
  1. 字节码的核心组成有哪些
      • 基本信息:
        • 魔数
        • 字节码文件对应的java版本号
        • 访问标识(public final等)
        • 父类和接口
      • 常量池:
        • 字符串常量、类或接口名、字段名(主要在字节码指令中使用)
      • 字段:
        • 当前类或接口声明的字段信息
      • 方法:
        • 当前类或接口的方法信息 , 字节码指令
      • 属性:
        • 类的属性 (源码的文件名 内部类的列表等)
        •