Java .class的文件结构

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文件结构
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。