class文件格式
类型 | 名称 | 数量 | 说明 |
---|---|---|---|
u4 | magic | 1 | 0xCAFEBABE |
u2 | minor_version | 1 | jdk版本号 |
u2 | major_version | 1 | jdk版本号 |
u2 | constant_pool_count | 1 | 从1开始、0项代表"不引用任何常量池项目“ |
cp_info | constant_pool | constant_pool_count-1 | 字面量(literal),符号引用(symbolic reference)[类接口全限定名、字段名和描述符、方法名和描述符] |
u2 | access_flags | 1 | |
u2 | this_class | 1 | |
u2 | super_class | 1 | |
u2 | interfaces_count | 1 | |
u2 | interfaces | interface_count | |
u2 | fields_count | 1 | |
field_info | fields | fields_count | |
u2 | methods_count | 1 | |
method_info | methods | methods_count | |
u2 | attributes_count | 1 | |
attribute_info | attributes | attributes_count |
- 常量池每一项都是一个表,1.7之前有11种表结构数据,1.7新增3种;字段、方法符号引用运行时转换获取入口
常量池项目类型
类型 | 标志(tag) | 描述 | 内容 |
---|---|---|---|
CONSTANT_Utf8_info | 1 | UTF-8编码字符串 | tag[u1]-length[u2]-bytes[u1] |
CONSTANT_Integer_info | 3 | 整型字面量 | tag[u1]-bytes[u4] |
CONSTANT_Float_info | 4 | 浮点型字面量 | tag[u1]-bytes[u4] |
CONSTANT_Long_info | 5 | 长整形字面量 | tag[u1]-bytes[u8] |
CONSTANT_Double_info | 6 | 双精度浮点型字面量 | tag[u1]-bytes[u8] |
CONSTANT_Class_info | 7 | 类或接口的符号引用 | tag[u1]-index[u2] |
CONSTANT_String_info | 8 | 字符串类型字面量 | tag[u1]-index[u2] |
CONSTANT_Fieldref_info | 9 | 字段的符号引用 | tag[u1]-index[u2]-index[u2] |
CONSTANT_Methodref_info | 10 | 类种方法的符号引用 | tag[u1]-index[u2]-index[u2] |
CONSTANT_InterfaceMethodref_info | 11 | 接口种方法的符号引用 | tag[u1]-index[u2]-index[u2] |
CONSTANT_NameAndType_info | 12 | 字段或方法的部分符号引用 | tag[u1]-index[u2]-index[u2] |
CONSTANT_MethodHandle_info | 15 | 表示方法句柄 | tag[u1]-reference_kind[u1]-reference_index[u2] |
CONSTANT_MethodType_info | 16 | 标识方法类型 | tag[u1]-descriptor_index[u2] |
CONSTANT_InvokeDynamic_info | 18 | 表示一个动态方法调用点 | tag[u1]-bootstrap_method_attr_index[u2]-name_and_type_index[u2] |
访问标志
标志名称 | 标志值 | 含义 |
---|---|---|
ACC_PUBLIC | 0x0001 | 是否为public类型 |
ACC_FINAL | 0x0010 | 是否声明为final,只有类可设置 |
ACC_SUPER | 0x0020 | 是否允许使用invokespecial字节码指令的新语意 |
ACC_INTERFACE | 0x0200 | 标识是否为一个接口 |
ACC_ABSTRACT | 0x0400 | 是否为abstract类型,接口或抽象类为真 |
ACC_SYNTHETIC | 0x1000 | 标识这个类并非由用户代码产生 |
ACC_ANNOTATION | 0x2000 | 标识这是一个注解 |
ACC_ENUM | 0x4000 | 标识这是一个枚举 |
字段表集合
类型 | 名称 | 数量 |
---|---|---|
u2 | access_flags | 1 |
u2 | name_index | 1 |
u2 | descriptor_index | 1 |
u2 | attributes_count | 1 |
attribute_info | attributes | attributes_count-1 |
字段访问标识
标识名称 | 标志值 | 含义 |
---|---|---|
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 | 字段是否由编译器产生的 |
ACC_ENUM | 0x4000 | 字段是否enum |
- 跟随access_flags标识的两项索引值:name_index和descriptor_index是对常量池引用,分别代表字段简单名称以及字段和方法的描述符
方法表集合
类型 | 名称 | 数量 |
---|---|---|
u2 | access_flags | 1 |
u2 | name_index | 1 |
u2 | descriptor_index | 1 |
u2 | attributes_count | 1 |
attribute_info | attributes | attributes_count |
方法访问标志
标志名称 | 标志值 | 含义 |
---|---|---|
ACC_PUBLIC | 0x0001 | 方法是否为public |
ACC_PRIVATE | 0x0002 | 方法是否为private |
ACC_PROTECTED | 0x0004 | 方法是否为protected |
ACC_STATIC | 0x0008 | 方法是否为static |
ACC_FINAL | 0x0010 | 方法是否为final |
ACC_SYNCHRONIZED | 0x0020 | 方法是否为synchonized |
ACC_BRIDGE | 0x0040 | 方法是否由编译器产生的桥接方法 |
ACC_VARAGRS | 0x0080 | 方法是否接受补丁参数 |
ACC_NATIVE | 0x0100 | 方法是否为native |
ACC_ABSTRACT | 0x0400 | 方法是否为abstract |
ACC_STRICTFP | 0x0800 | 方法是否为strictfp |
ACC_SYNTHETIC | 0x1000 | 方法是否由编译器自动产生 |
属性表集合
属性名称 | 使用位置 | 含义 |
---|---|---|
Code | 方法表 | java代码编译成的字节码指令 |
ConstantValue | 字段表 | final关键字定义的常量值 |
Deprecated | 类、方法表、字段表 | 被声明为deprecated的方法和字段 |
Exception | 方法表 | 方法抛出的异常 |
EnclosingMethod | 类文件 | 仅当一个类为局部类或者匿名类时才能拥有这个属性,这个属性用于标识这个类所在的外围方法 |
InnerClasses | 类文件 | 内部类列表 |
LineNumberTable | Code属性 | 源码行号与字节码指令的对应关系 |
LocalVariableTable | Code属性 | 方法的局部变量描述 |
StackMapTable | Code属性 | 1.6新增,类型检查验证器检查 |
Signature | 类、方法表、字段表 | 1.5新增,泛型签名 |
SourceFile | 类文件 | 记录源文件名称 |
SourceDebugExtension | 类文件 | 1.6新增,存储调试信息 |
Synthetic | 类、方法表、字段表 | 标识方法或字段为编译器自动生成 |
LocalVariableTypeTable | 类 | 1.5新增、特征签名代替描述符 |
RuntimeVisibleAnnotation | 类、方法表、字段表 | 1.5新增、动态注解支持,运行时可见 |
RuntimeInvisibleAnnotation | 类、方法表、字段表 | 1.5新增、动态注解运行时不可见 |
RuntimeVisibleParameterAnnotations | 方法表 | 1.5新增,作用对象为方法参数 |
RuntimeInvisibleParameterAnnotation | 方法表 | 1.5新增,作用对象为方法参数 |
AnnotationDefault | 方法表 | 1.5新增,记录注解类元素默认值 |
BootstrapMethods | 类文件 | 1.7新增,保存invokedynamic指令引用的引导方法限定符 |
网友评论