美文网首页
Java .class的文件结构

Java .class的文件结构

作者: zhaozhaoicode | 来源:发表于2020-05-13 00:09 被阅读0次

    class文件结构

    • Magic Number
      • CA FE BA BE
    • Minor Version
      • class文件的版本号
    • Major Version
    • constant_pool_count
    • constant_pool 长度为constant_pool_count-1的表
      • 1 CONSTANT_Utf8_info
        • tag:1 占用一个字节的空间
        • length 占用的字节数
        • bytes 长度为length的字符串
      • 3 CONSTANT_Integer_info
        • tag:3
        • bytes 4个字节,Big-Endian(高位在前)存储int值
      • 4 CONSTANT_Float_info
        • tag:4
        • bytes 4个字节,Big-Endian存储float值
      • 5 CONSTANT_Long_info
        • tag:5
        • bytes 8个字节,Big-Endian存储long值
      • 6 CONSTANT_Double_info
        • tag:6
        • bytes 8个字节,Big-Endian存储double值
      • 7 CONSTANT_Class_info
        • tag:7
        • index 2字节指向类全限定明项的索引
      • 8 CONSTANT_String_info
        • tag:8
        • index 2字节指向字符串自变量的索引
      • 9 CONSTANT_Fieldref_info
        • tag:9
        • index 2字节指向声明字段的类或者接口描述符CONSTANT_Class_info的索引项
        • index 2字节指向字段描述符CONSTANT_NameAndType的索引项
      • 10 CONSTANT_Methodref_info
        • tag:10
        • index 2字节指向声明字段的类或者接口描述符CONSTANT_Class_info的索引项
        • index 2字节指向字段描述符CONSTANT_NameAndType的索引项
      • 11 CONSTANT_InterfaceMethodref_info
        • tag:11
        • index 2字节指向声明字段的类或者接口描述符CONSTANT_Class_info的索引项
        • index 2字节指向字段描述符CONSTANT_NameAndType的索引项
      • 12 CONSTANT_NameAndType_info
        • tag:12
        • index 2字节指向该字段或方法名称常量项的索引
        • index 2字节指向该字段或方法描述符常量项的索引
      • 15 CONSTANT_MethodHandle_info
        • tag:15
        • reference_kind 1字节 1-9之间的一个值,决定了方法句柄的类型。方法句柄类型的值标示方法句柄的字节码行为。
        • reference_index 2字节 对常量池的有效引用
      • 16 CONSTANT_MethodType_info
        • tag:16
        • descriptor_index 2字节 指向Utf8_info结构表示的方法描述符
      • 18 CONSTANT_InvokeDynamic_info
        • tag:18
        • bootstrap_method_attr_index 2字节 当前Class文件中引导方法表bootstrap_methods[]数组的有效索引
        • name_and_type_index 2字节 指向NameAndType_info表示的方法名和方法描述符
    • access_flags (位运算)
      • ACC_PUBLIC 0x0001 是否为public类型
      • ACC_FINAL 0x0010 是否为final类型
      • ACC_SUPER 0x0020 该标志必须为真,JDK1.0.2之后编译出来的内容必须为真,指明invokespectial指令使用新语义
      • ACC_INTERFACE 0x0200 是否为接口
      • ACC_ABSTRACT 0x0400 是否为接口或抽象类
      • ACC_SYNTHETIC 0x1000 编译器自动生成,非用户代码产生
      • ACC_ANNOTATION 0x2000 是否为注解
      • ACC_ENUM 0x4000
    • this_class
    • super_class
    • interfaces_count
    • interfaces
    • fields_count
    • fields
      • access_flags 2字节
        • ACC_PUBLIC 0x0001
        • ACC_PRIVATE 0x0002
        • ACC_PROTECTED 0x0004
        • ACC_STATIC 0x0008
        • ACC_FINAL 0x0010
        • ACC_VOLATILE 0x0040
        • ACC_TRANSIENT 0x0080
        • ACC_SYNTHETIC 0x1000
        • ACC_ENUM 0x4000
      • name_index u2
      • descriptor_index u2
        • B - byte
        • C - char
        • D - double
        • F - float
        • I - int
        • J - long
        • S - short
        • Z - boolean
        • V - void
        • L - Object
        • 数组[ -
          • 一维数组[B[Ljava/lang/String
          • 多维数组[[C[[[Ljava/lang/String
      • attributes_count
      • attributes
    • methods_count
    • methods
      • access_flags 2字节
        • ACC_PUBLIC 0x0001
        • ACC_PRIVATE 0x0002
        • ACC_PROTECTED 0x0004
        • ACC_STATIC 0x0008
        • ACC_FINAL 0x0010
        • ACC_SYNTHETIC 0x020
        • ACC_BRIDGE 0x0040 编译器产生的桥接方法
        • ACC_VARARGS 0x0080
        • ACC_NATIVE 0x0100
        • ACC_ABSTRACT 0x0400
        • ACC_STRICTFP 0x0800
        • ACC_SYNTHETIC 0x1000
      • name_index u2
      • descriptor_index u2
        • 先参数列表(放在小括号内部)后返回值
        • void m() -> ()V
        • String toString() -> ()Ljava/lang/String;
        • long pos(int[] arr1, int arr2, long length) -> ([IIJ)J
      • attributes_count
      • attributes
    • attributes_count
    • attributes
      • 既有预定义属性,也可以自定义,java虚拟机自动忽略不认识的属性
      • Code - 方法表 - 该方法编译成的字节码指令
        • u2 attribute_name_index
        • u4 attribute_length
        • u2 max_stack
        • u2 max_locals
        • u4 code_length
        • code
        • u2 exception_table_length
        • exception_table
        • u2 attribute_count
        • attributes
      • ConstantValue - 字段表 - final关键字定义的常量值
      • Deprecated - 类、方法表、字段表
      • Exceptions - 方法表
      • EnchosingMethod - 类文件 - 局部类或匿名类的外部封装方法
      • InnerClass - 类文件 - 内部类列表
      • LineNumberTable - Code属性 - java源码的行号与字节码指令的对应关系
      • LocalVariableTable - Code属性 - 方法局部变量表
      • SourceFile - 类文件 - 源文件名称

    IDEA可以安装插件查看class文件结构

    jclasslib
    https://plugins.jetbrains.com/plugin/index?xmlId=jclasslib

    可以选中编译完成的class文件,在idea菜单view下有个show bytecode with jclasslib


    jclasslib.png class文件结构

    相关文章

      网友评论

          本文标题:Java .class的文件结构

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