class文件结构参照表

引言

我们知道,java语言之所以能够跨平台运行,一方面是因为jvm帮助我们屏蔽了操作系统之间的差异性,而另一方面则是class文件的独特性。
程序员编写的文件是.java文件,而javac命令能够帮我们将.java文件编译成.class文件,那class文件的结构是怎样的?

class类文件结构

一个class文件总共包含以下15个部分

字段名称描述长度备注
magic唯一标识4class文件固定为0xcafebabe
versionclass版本号4包括minor_version和major_version
constant_pool_count常量池数量2
constant_pool[1~constant_pool_count]常量池内容constant_pool[0]专用于空指向
access_flags访问标志2
this_class当前类名2当前类的全限定名
super_class父类名2父类的全限定名
interfaces_count接口数量2
interfaces[interfaces_count]接口内容
fields_count属性数量2
fields[fields_count]属性内容
methods_count方法数量2
methods[methods_count]方法内容
attributes_count附加属性数量2
attributes[attributes_count]附加属性内容

常量池

在常量池中,java总共包含14中不同类型的常量池,如下表

常量名称描述字段tag字段2字段3长度(字节)
CONSTANT_Utf8_infouf-8编码的字符串1u2 lengthulength bytes[length]length+3
CONSTANT_Integer_info整型字面量3u4 bytes5
CONSTANT_Float_info浮点型字面量4u4 bytes5
CONSTANT_Long_info长整型字面量5u4 high_bytesu4 low_bytes9
CONSTANT_Double_info双精度型字面量6u4 high_bytesu4 low_bytes9
CONSTANT_Class_info表示类或接口7u2 name_index3
CONSTANT_String_infoString类型的常量对象8u2 string_index3
CONSTANT_Fieldref_info字段信息表9u2 class_indexu2 name_and_type_index5
CONSTANT_Methodref_info方法10u2 class_indexu2 name_and_type_index5
CONSTANT_InterfaceMethodref_info接口方法11u2 class_indexu2 name_and_type_index5
CONSTANT_NameAndType_info名称和类型表12u2 name_indexu2 descriptor_index5
CONSTANT MethodHandle_info方法句柄表15u1 reference_kindu2 reference_index4
CONSTANT_MethodType_info方法类型表16u2 descriptor_index3
CONSTANT_InvokeDynamic_info动态方法调用点18u2 bootstrap_method_attr_indexu2 name_and_type_index5

访问标志符

实际存储的值通过位运算的形式进行计算最终的访问标志,比如0x0021 = 0x0020 + 0x0001

字段名称描述
ACC_PUBLIC0x0001是否为public类型
ACC_FINAL0x0010是否为final
ACC_SUPER0x0020该标志必须为真,JDK1.0.2之后编译出来的内容必须为真,指明invokespectial指令使用新语义
ACC_INTERFACE0x0200是否接口
ACC_ABSTRACT0x0400接口或抽象类
ACC_SYNTHETIC0x1000编译器自动生成,非用户代码产生
ACC_ANNOTATION0x2000是否为注解
ACC_ENUM0x4000是否为枚举

属性、方法

字段名称描述大小
access_flags访问符2字节
name_index名称指向2
descriptor_index u2描述指向2
attributes_count属性长度4
attributes属性名索引2

版权声明:本文为weixin_43660088原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。