类通过编译器编译后变成字节码文件,字节码文件是一种jvm可以运行的文件。
字节码文件的组成
- 常量池
- 接口
- 方法
- 属性
- 字段
- 基本信息(魔数,字节码文件对应的java版本号,访问标识(public final abstract等等),父类和接口)
基本信息
魔数
如图所示,每个字节码文件都是以cafebabe开头,这个就称为魔数
那么魔数的作用是什么?我们知道文件是无法通过文件扩展名来确认文件类型的,文件扩展名可以随意更改,不会影响文件内容,就比如我们将一张以.png结尾的文件的扩展名改成.avi,在使用画图软件还是可以打开。所以软件是以文件的头几个数字来检验文件的类型,如果软件不支持这种类型就会出错。
下面是常见的文件的文件头
魔数和这个文件头功能是一样的。
主副版本号
主副版本号指的是编译字节码文件所对应的版本号,主版本号用来标识大版本号,JDK1.0-1.1使用45.0-45.3,JDK1.2使用了46,以后每更新一个大版本加以,副版本号用来进行主版本号相同时的版本区分。主要的作用是来进行校验当前环境是否可以运行当前字节码文件。
常量池
常量池主要的作用是避免相同的内容重复定义,节省内存空间
常量池中的数据都有一个编号,从1开始,在字段或者字节码指令中可以通过编号快速定位到指定字符串
字节码指令中通过编号引用到常量池的过程称为符号引用
方法
字节码中的方法区域是存放字节码指令的核心区域,主要的知识点是字节码的指令阅读。
查看字节码文件可以使用jclasslib,javap,arthas等工具。