概述
一种特定格式的二进制文件,它定义了一个类或接口的信息。
每个 类或接口 都会被编译为一个独立的Class文件。包括匿名内部类 。
javac.exe 将 .Java 文件编译成 .class 文件,然后 JVM 才能解释执行它。
特点
- 字节码文件名 同类名。
- 包含了被编译后的字节码,它是一种中间语言形式,介于源代码和目标机器代码之间。
- 项目构建后,存放在编译结果中。
- out 存放的是该项目下所有Module(模块)的编译结果。
- target 存放的是单个Module的编译结果。
- 如果为某个Module指定了编译结果的路径,则不会再输出到out文件夹中了。
- 格式严格限定,紧凑且没有分隔符。
- 删除注释。
- 无法直接阅读,能通过反编译工具 javap.exe,把 class 字节码文件反编译为源文件。
- 本质:一串二进制字节流。而不是一个文件。
内容
• 类的字段、方法、接口等描述信息
• 常量池(constant_pool table):存放编译期已可知的常量。
这部分内容将在类加载后进入 方法区 存放(实际上在堆中)。
运行期间也可将新内容放入常量池(如String.intern()方法)。
结构
- 魔数(Magic Number):前4个字节。
作用:确定该文件是否能被某虚拟机接受。(安全考虑:文件扩展名可随意改动) - Class文件的版本号:4个字节。5-6字节是 次版本号,7-8字节是 主版本号。
Class 文件向下兼容,不向上兼容。java8为 52.0。
IDEA可以设置项目的目标字节码版本: - 常量池:就像资源仓库。
常量数量在入口的 常量池容量计数值 设置,从1开始,代表0个。
内容:字面量、符号引用。 - 访问标志:2个字节。
作用:识别一些类或接口层次的访问信息(这个Class是类还是接口、是否抽象类等) - 类索引、父类索引、接口索引
作用:确定类的继承关系 - 字段表集合
作用:描述接口或类中声明的变量。 - 方法表集合
存储方法的信息。 - 属性表集合
指令
字节码指令由 操作码 和 0或多个操作数 组成。
操作码:代表某种特定操作含义的数字,长1字节。
操作数:代表操作参数。