字节码常用工具:
- javap命令
- Jclasslib字节码插件
- Arthas
一. 打开字节码文件
- 字节码文件中保存了源代码编译之后的内容,以二进制的方式存储,可以使用NotePad++使用16进制插件查看class文件
- 使用jclasslib工等具查看字节码文件
二. 字节码文件的组成
1.基本信息:
( 1 ).Magic魔数
- 文件是无法通过文件拓展名来确定文件类型的(拓展名可以随意修改)
- 软件使用文件的头几个字节(文件头)去校验文件的类型,如果软件不支持该类型则出错
- Java字节码文件中,将文件头称为magic魔数
( 2 ).主副版号
- 主副版本号指的是编译字节码文件的JDK版本号,主版本号用来表示大版本号,JDK1.0-1.1使用了45.0-45.3,JDK1.2是46之后每升级一个大版本就加1;副版本号是当主版本号相同时作为区分不同 版本的标识,一般只需要关心主版本号
- 版本号的作用主要就是判断当前字节码文件的版本和运行时的JDK是否兼容
( 3 ).基础信息汇总
- Magic魔数:固定位 0xCAFEBABE不会变
- 主副版本号 : 验证字节码文件的版本
- 访问标识: 标识是类还是接口、注解、枚举、模块 和 public final abstract
- 类、父类、接口索引: 通过这些索引可以找到 类、父类、接口的信息
2.常量池:
- 字节码文件常量池的作用:避免相同的内容重复定义,节省空间
- 常量池中的数据都有一个编号,从1开始 。在字段或者字节码指令中通过编号可以快速找到对应数据
- 字节码指令中通过编号引用到常量池的过程称之为符号引用;
3.方法:
- 字节码中的方法区域是存放字节码指令的核心位置 , 字节码指令的内容存放在方法的Code属性中
- 操作数栈是临时存放数据的地方 , 局部变量表是存放方法中的局部变量的位置
总结:
- 如何查看字节码文件
- 本地文件可以使用jclasslib工具查看 , 开发环境使用jclasslib插件
- 服务器上文件使用javap命令
- 通过Arthas的dump命令导出字节码文件再查看本地文件或者直接使用jad命令反编译出源码
- 字节码的核心组成有哪些
- 基本信息:
- 魔数
- 字节码文件对应的java版本号
- 访问标识(public final等)
- 父类和接口
- 常量池:
- 字符串常量、类或接口名、字段名(主要在字节码指令中使用)
- 字段:
- 当前类或接口声明的字段信息
- 方法:
- 当前类或接口的方法信息 , 字节码指令
- 属性:
- 类的属性 (源码的文件名 内部类的列表等)