目录
- Class文件结构
- 10.1. 属性计数器
- 10.2. 属性表
- 9.1. 方法计数器
- 9.2. 方法表
- 8.1. 字段计数器
- 8.2. 字段表
- 5.1. 常量池计数器
- 5.2. 常量池表
- 4.1. Class文件版本号对应关系
- 1. Class字节码文件结构
- 2. Class文件数据类型
- 3. 魔数
- 4. 文件版本号
- 5. 常量池集合
- 6. 访问标志
- 7. 类索引、父类索引、接口索引
- 8. 字段表集合
- 9. 方法表集合
- 10. 属性表集合
Class文件结构1. Class字节码文件结构
| 类型 | 名称 | 说明 | 长度 | 数量 | 魔数u4magic魔数,识别Class文件格式4个字节1版本号u2minor_version副版本号(小版本)2个字节1u2major_version主版本号(大版本)2个字节1常量池集合u2constant_pool_count常量池计数器2个字节1cp_infoconstant_pool常量池表n个字节constant_pool_count - 1访问标识u2access_flags访问标识2个字节1索引集合u2this_class类索引2个字节1u2super_class父类索引2个字节1u2interfaces_count接口计数器2个字节1u2interfaces接口索引集合2个字节interfaces_count字段表集合u2fields_count字段计数器2个字节1field_infofields字段表n个字节fields_count方法表集合u2methods_count方法计数器2个字节1method_infomethods方法表n个字节methods_count属性表集合u2attributes_count属性计数器2个字节1attribute_infoattributes属性表n个字节attributes_count
2. Class文件数据类型
数据类型 | 定义 | 说明 | 无符号数无符号数可以用来描述数字、索引引用、数量值或按照utf-8编码构成的字符串值。其中无符号数属于基本的数据类型。 以u1、u2、u4、u8来分别代表1个字节、2个字节、4个字节和8个字节表表是由多个无符号数或其他表构成的复合数据结构。所有的表都以“_info”结尾。 由于表没有固定长度,所以通常会在其前面加上个数说明。
3. 魔数
4. 文件版本号
4.1. Class文件版本号对应关系
主版本(十进制) | 副版本(十进制) | 编译器版本 | 4531.14601.24701.34801.44901.55001.65101.75201.85301.95401.105501.11
5. 常量池集合
类型 | 名称 | 数量 | u2(无符号数)constant_pool_count1cp_info(表)constant_poolconstant_pool_count - 1
5.1. 常量池计数器
5.2. 常量池表
类型 | 标志(或标识) | 描述 | CONSTANT_Utf8_info1UTF-8编码的字符串CONSTANT_Integer_info3整型字面量CONSTANT_Float_info4浮点型字面量CONSTANT_Long_info5长整型字面量CONSTANT_Double_info6双精度浮点型字面量CONSTANT_Class_info7类或接口的符号引用CONSTANT_String_info8字符串类型字面量CONSTANT_Fieldref_info9字段的符号引用CONSTANT_Methodref_info10类中方法的符号引用CONSTANT_InterfaceMethodref_info11接口中方法的符号引用CONSTANT_NameAndType_info12字段或方法的符号引用CONSTANT_MethodHandle_info15表示方法句柄CONSTANT_MethodType_info16标志方法类型CONSTANT_InvokeDynamic_info18表示一个动态方法调用点
标志符 | 含义 | B基本数据类型byteC基本数据类型charD基本数据类型doubleF基本数据类型floatI基本数据类型intJ基本数据类型longS基本数据类型shortZ基本数据类型booleanV代表void类型L对象类型,比如:Ljava/lang/Object;[数组类型,代表一维数组。比如:`double[][][] is [[[D
6. 访问标志
标志名称 | 标志值 | 含义 | ACC_PUBLIC0x0001标志为public类型ACC_FINAL0x0010标志被声明为final,只有类可以设置ACC_SUPER0x0020标志允许使用invokespecial字节码指令的新语义,JDK1.0.2之后编译出来的类的这个标志默认为真。(使用增强的方法调用父类方法)ACC_INTERFACE0x0200标志这是一个接口ACC_ABSTRACT0x0400是否为abstract类型,对于接口或者抽象类来说,次标志值为真,其他类型为假ACC_SYNTHETIC0x1000标志此类并非由用户代码产生(即:由编译器产生的类,没有源码对应)ACC_ANNOTATION0x2000标志这是一个注解ACC_ENUM0x4000标志这是一个枚举
7. 类索引、父类索引、接口索引
长度 | 含义 | u2this_classu2super_classu2interfaces_countu2interfaces[interfaces_count]
8. 字段表集合
8.1. 字段计数器
标志名称 | 标志值 | 含义 | 数量 | u2access_flags访问标志1u2name_index字段名索引1u2descriptor_index描述符索引1u2attributes_count属性计数器1attribute_infoattributes属性集合attributes_count8.2. 字段表
标志名称 | 标志值 | 含义 | ACC_PUBLIC0x0001字段是否为publicACC_PRIVATE0x0002字段是否为privateACC_PROTECTED0x0004字段是否为protectedACC_STATIC0x0008字段是否为staticACC_FINAL0x0010字段是否为finalACC_VOLATILE0x0040字段是否为volatileACC_TRANSTENT0x0080字段是否为transientACC_SYNCHETIC0x1000字段是否为由编译器自动产生ACC_ENUM0x4000字段是否为enum
标志符 | 含义 | B基本数据类型byteC基本数据类型charD基本数据类型doubleF基本数据类型floatI基本数据类型intJ基本数据类型longS基本数据类型shortZ基本数据类型booleanV代表void类型L对象类型,比如:Ljava/lang/Object;[数组类型,代表一维数组。比如:`double[][][] is [[[D
9. 方法表集合
9.1. 方法计数器
9.2. 方法表
标志名称 | 标志值 | 含义 | 数量 | u2access_flags访问标志1u2name_index方法名索引1u2descriptor_index描述符索引1u2attributes_count属性计数器1attribute_infoattributes属性集合attributes_count
标志名称 | 标志值 | 含义 | ACC_PUBLIC0x0001public,方法可以从包外访问ACC_PRIVATE0x0002private,方法只能本类访问ACC_PROTECTED0x0004protected,方法在自身和子类可以访问ACC_STATIC0x0008static,静态方法
10. 属性表集合
10.1. 属性计数器
10.2. 属性表
类型 | 名称 | 数量 | 含义 | u2attribute_name_index1属性名索引u4attribute_length1属性长度u1infoattribute_length属性表
属性名称 | 使用位置 | 含义 | Code方法表Java代码编译成的字节码指令ConstantValue字段表final关键字定义的常量池Deprecated类,方法,字段表被声明为deprecated的方法和字段Exceptions方法表方法抛出的异常EnclosingMethod类文件仅当一个类为局部类或者匿名类时才能拥有这个属性,这个属性用于标识这个类所在的外围方法InnerClass类文件内部类列表LineNumberTableCode属性Java源码的行号与字节码指令的对应关系LocalVariableTableCode属性方法的局部变量描述StackMapTableCode属性JDK1.6中新增的属性,供新的类型检查检验器和处理目标方法的局部变量和操作数有所需要的类是否匹配Signature类,方法表,字段表用于支持泛型情况下的方法签名SourceFile类文件记录源文件名称SourceDebugExtension类文件用于存储额外的调试信息Synthetic类,方法表,字段表标志方法或字段为编译器自动生成的LocalVariableTypeTable类是哟很难过特征签名代替描述符,是为了引入泛型语法之后能描述泛型参数化类型而添加RuntimeVisibleAnnotations类,方法表,字段表为动态注解提供支持RuntimeInvisibleAnnotations类,方法表,字段表用于指明哪些注解是运行时不可见的RuntimeV����,�ۻ�isibleParameterAnnotation方法表作用与RuntimeVisibleAnnotations属性类似,只不过作用对象或方法RuntimeInvisibleParameterAnnotation方法表作用与RuntimeInvisibleAnnotations属性类似,只不过作用对象或方法AnnotationDefault方法表用于记录注解类元素的默认值BootstrapMethods类文件用于保存invokeddynamic指令引用的引导方法限定符
类型 | 名称 | 数量 | 含义 | u2attribute_name_index1属性名索引u4attribute_length1属性长度u2max_stack1操作数栈深度的最大值u2max_locals1局部变量表所需的存续空间u4code_length1字节码指令的长度u1codecode_lenth存储字节码指令u2exception_table_length1异常表长度exception_infoexception_tableexception_length异常表u2attributes_count1属性集合计数器attribute_infoattributesattributes_count属性集合