工欲善其事必先利其器之class文件

2019-04-09  本文已影响0人  scuta

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

常量池项目类型

类型 标志(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

方法表集合

类型 名称 数量
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指令引用的引导方法限定符
上一篇下一篇

猜你喜欢

热点阅读