关于 .class 文件的相关结构说明

1、字节码文件相关名词
| 类型 | 名称 | 数量 |
|---|---|---|
| u4 | magic | 1 |
| u2 | minor_version | 1 |
| u2 | major_version | 1 |
| u2 | constant_pool_count | 1 |
| cp_info | constant_pool | constant_pool_count - 1 |
| u2 | access_flags | 1 |
| u2 | this_class | 1 |
| u2 | super_class | 1 |
| u2 | interfaces_count | 1 |
| u2 | interfaces | interfaces_count |
| u2 | fields_count | 1 |
| field_info | fields | fields_count |
| u2 | methods_count | 1 |
| method_info | methods | methods_count |
| u2 | attribute_count | 1 |
| attribute_info | attributes | attributes_count |
2、jdk编译版本对照表
| JDK 编译器版本 | target 参数 | 十六进制 minor.major | 十进制 major.minor |
|---|---|---|---|
| jdk1.1.8 | 不能带 target 参数 | 00 03 00 2D | 45.3 |
| jdk1.2.2 | 不带(默认为 -target 1.1) | 00 03 00 2D | 45.3 |
| jdk1.2.2 | -target 1.2 | 00 00 00 2E | 46.0 |
| jdk1.3.1_19 | 不带(默认为 -target 1.1) | 00 03 00 2D | 45.3 |
| jdk1.3.1_19 | -target 1.3 | 00 00 00 2F | 47.0 |
| j2sdk1.4.2_10 | 不带(默认为 -target 1.2) | 00 00 00 2E | 46.0 |
| j2sdk1.4.2_10 | -target 1.4 | 00 00 00 30 | 48.0 |
| jdk1.5.0_11 | 不带(默认为 -target 1.5) | 00 00 00 31 | 49.0 |
| jdk1.5.0_11 | -target 1.4 -source 1.4 | 00 00 00 30 | 48.0 |
| jdk1.6.0_01 | 不带(默认为 -target 1.6) | 00 00 00 32 | 50.0 |
| jdk1.6.0_01 | -target 1.5 | 00 00 00 31 | 49.0 |
| jdk1.6.0_01 | -target 1.4 -source 1.4 | 00 00 00 30 | 48.0 |
| jdk1.7.0 | 不带(默认为 -target 1.6) | 00 00 00 32 | 50.0 |
| jdk1.7.0 | -target 1.7 | 00 00 00 33 | 51.0 |
| jdk1.7.0 | -target 1.4 -source 1.4 | 00 00 00 30 | 48.0 |
3、类的访问标识符
| Flag Name | Value | Interpretation |
|---|---|---|
| ACC_PUBLIC | 0x0001 | public |
| ACC_FINAL | 0x0010 | final,不能被继承. |
| ACC_SUPER | 0x0020 | 是否允许使用invokespecial指令,JDK1.2后,该值为true |
| ACC_INTERFACE | 0x0200 | 是否是接口 |
| ACC_ABSTRACT | 0x0400 | 抽象类 |
| ACC_SYNTHETIC | 0x1000 | 该类不是由用户代码生成,运行时生成的,没有源码 |
| ACC_ANNOTATION | 0x2000 | 是否为注解 |
| ACC_ENUM | 0x4000 | 是否是枚举 |
4、字段的访问标识符
| Flag Name | Value | Interpretation |
|---|---|---|
| ACC_PUBLIC | 0x0001 | public |
| ACC_PRIVATE | 0x0002 | private |
| ACC_PROTECTED | 0x0004 | protected |
| ACC_STATIC | 0x0008 | static. |
| ACC_FINAL | 0x0010 | final |
| ACC_VOLATILE | 0x0040 | volatile |
| ACC_TRANSIENT | 0x0080 | transient |
| ACC_SYNTHETIC | 0x1000 | synthetic; 没有源码,编译器生成 |
| ACC_ENUM | 0x4000 | 枚举类型 |
5、字段类型表示含义
| 简称 | 含义 | 备注 |
|---|---|---|
| B | byte | |
| C | char | |
| D | double | |
| F | float | |
| I | int | |
| J | long | |
| S | short | |
| Z | boolean | |
| V | void | |
| L | 对象 | Ljava/lang/Object |
| [ | 数组 | [[Ljava/lang/String; = String |
6、方法的访问标识符
| Flag Name | Value | Interpretation |
|---|---|---|
| ACC_PUBLIC | 0x0001 | public |
| ACC_PRIVATE | 0x0002 | private |
| ACC_PROTECTED | 0x0004 | protected |
| ACC_STATIC | 0x0008 | static |
| ACC_FINAL | 0x0010 | final |
| ACC_SYNCHRONIZED | 0x0020 | synchronized |
| ACC_BRIDGE | 0x0040 | 编译器产生 桥接方法 |
| ACC_VARARGS | 0x0080 | 可变参数 |
| ACC_NATIVE | 0x0100 | native |
| ACC_ABSTRACT | 0x0400 | abstract |
| ACC_STRICT | 0x0800 | strictfp |
| ACC_SYNTHETIC | 0x1000 | 不在源码中,由编译器产生 |
使用示例:
-
void inc() ()V
-
void setId(int) (I)V
-
int indexOf(char[],int ) ([CI)I
7、扩展信息描述(attribute)
| 名称 | 使用者 | 描述 |
|---|---|---|
| Deprecated | field method | 字段、方法、类被废弃 |
| ConstantValue | field | final常量 |
| Code | method | 方法的字节码和其他数据 |
| Exceptions | method | 方法的异常 |
| LineNumberTable | Code_Attribute | 方法行号和字节码映射 |
| LocalVaribleTable | Code_Attribute | 方法局部变量表描述 |
| SourceFile | Class file | 源文件名 |
| Synthetic | field method | 编译器产生的方法或字段 |



















![[嵌入式C][入门篇] 快速掌握基础(9个语句)](https://img-blog.csdnimg.cn/direct/05930fad5523414990bad694bc64ed15.png)