Class文件详解
什么是Class文件
基本概念
- 能够被JVM识别,加载并执行的文件格式
谁能生成class文件?
- Java语言
- Scala语言
- Python语言
- 其他语言
其实不止class文件,很多语言都行(最终将class文件交给JVM执行)
如何生成一个class文件
- 通过IDE自动帮我们build
- 手动通过javac去生成class文件
- 通过 java命令去执行class文件
class文件的作用
- 记录一个类文件的所有信息记住所有!
也就是为什么我们没声明 this super 却可以调用的原因
class文件格式的详解
- 一种8位字节的二进制流文件
- 各个数据按顺序紧密的排列,无间隔
- 每个类、接口、枚举 等 都单独占据一个class文件
class文件结构
class文件中定义了这么多字段,java虚拟机就可以找到每个class文件中的内容
类型 | 名称 | 数量 | 作用 |
---|---|---|---|
u4(无符号四字节) | magic | 1 | 加密段,文件是否被篡改过 |
u2 | minor_verstion | 1 | 最小适配的JDK版本 |
u2 | major_verstion | 1 | 表示当前class是用哪个jdk版本生成的 |
u2 | constant_pool_count | 1 | 当前class常量池数量 |
cp_info | constant_pool | constant_pool_count - 1 | 真正的常量池(结构体类型) |
u2 | access_flags | 1 | 作用域标志(public private等 四大权限) |
u2 | this_class | 1 | java虚拟机生成的时候补充了this字段,用于调用 |
u2 | super_class | 1 | 与上同理 |
u2 | interfaces_count | 1 | 只记录当前类,直接继承的接口(而不会递归) |
u2 | interfaces | interfaces_count | |
u2 | fields_count | 1 | 当前class文件中 所有的成员变量数 |
field_info | fields | fields_count | 包含每个成员变量的name,类型 |
u2 | methods_count | 1 | 当前方法数量 |
method_info | methods | methods_count | 方法name,类型,所属的类等 |
u2 | attribute_count | 1 | 类的属性相关的(上面字段没包含的内容,比如注解) |
attribute_info | attributes | attribute_count |
access_flags的取值范围
constant_pool
简单的类型(不仅仅只有这几种)
- CONSTANT_Interger_info
- CONSTANT_Long_info
- CONSTANT_String_info
复杂一点的
这些只是存储了一些索引
- CONSTANT_Class_info
:类相关的信息,当前类的名字,包括引用到得类的一些信息
- CONSTANT_Fieldref_info
:记录我们当前字节码中得成员变量
- CONSTANT_Methodref_info
: 记录我们当前字节码中得方法