美文网首页
工欲善其事必先利其器之class文件

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

作者: scuta | 来源:发表于2019-04-09 23:16 被阅读0次

    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指令引用的引导方法限定符

    相关文章

      网友评论

          本文标题:工欲善其事必先利其器之class文件

          本文链接:https://www.haomeiwen.com/subject/xujwiqtx.html