JVM 【Class文件结构】

2018年6月7日 作者 jacky
  • 语言无关性
  • 文件结构
    • 魔数
    • 版本
    • 常量池
    • 访问符
    • 类、超类、接口
    • 字段
    • 方法
    • 属性

语言无关性

文件结构

  • magic u4
    • 0xCAFEBABE
  • minor_version u2
  • major_version u2

文件结构-常量池

  • constant_pool_count u2
  • constant_pool cp_info

    • CONSTANT_Utf8 1 UTF-8编码的Unicode字符串
    • CONSTANT_Integer 3 int类型的字面值
    • CONSTANT_Float 4 float类型的字面值
    • CONSTANT_Long 5 long类型的字面值
    • CONSTANT_Double 6 double类型的字面值
    • CONSTANT_Class 7 对一个类或接口的符号引用
    • CONSTANT_String 8 String类型字面值的引用
    • CONSTANT_Fieldref 9 对一个字段的符号引用
    • CONSTANT_Methodref 10 对一个类中方法的符号引用
    • CONSTANT_InterfaceMethodref 11 对一个接口中方法的符号引用
    • CONSTANT_NameAndType 12 对一个字段或方法的部分符号引用
  • CONSTANT_Utf8

    • tag 1
    • length u2
    • bytes[length]
  • CONSTANT_Integer

    • tag 3
    • byte u4
public static final int sid=99;

  • CONSTANT_String
    • tag 8
    • string_index u2 (指向utf8的索引)
public static final String sname="geym";

  • CONSTANT_NameAndType
    • tag 12
    • name_index u2 (名字,指向utf8)
    • descriptor_index u2 (描述符类型,指向utf8)

  • CONSTANT_Class
    • tag 7
    • name_index u2 (名字,指向utf8)

  • CONSTANT_Fieldref ,CONSTANT_Methodref ,CONSTANT_InterfaceMethodref
    • tag 9 ,10, 11
    • class_index u2 (指向CONSTANT_Class)
    • name_and_type_index u2 (指向CONSTANT_NameAndType)

文件结构 – field

  • access flag u2:类的标示符

  • this_class u2
    • 指向常量池的Class
  • super_class u2

    • 指向常量池的Class
  • interface_count u2

    • 接口数量
  • interfaces

    • interface_count 个 interface u2
    • 每个interface是指向CONSTANT_Class的索引
  • field_count

    • 字段数量
  • fields

    • field_count个field_info
  • field

    • access_flags u2
    • name_index u2
    • descriptor_index u2
    • attributes_count u2
    • attribute_info attributes[attributes_count];
  • access_flags

  • name_index u2
    • 常量池引用 ,表示字段的名字
  • descriptor_index
    • 表示字段的类型
      • B byte
      • C char
      • D double
      • F float
      • I int
      • J long
      • S short
      • Z boolean
      • V void
      • L 对象
        • Ljava/lang/Object;
      • [
        • 数组 [[Ljava/lang/String; = String[][]

问题:descriptor_index的字符串存放位置在哪里?

文件结构-method

  • methods_count
    • 方法数量
  • methods

    • methods_count个method_info
  • method_info

    • access_flags u2
    • name_index u2
    • descriptor_index u2
    • attributes_count u2
    • attribute_info attributes[attributes_count];
  • access flag

  • name_index u2
    • 方法名字,常量池UTF-8索引
  • descriptor_index u2

    • 描述符,用于表达方法的参数和返回值
  • 方法描述符

    • void inc() ()V
    • void setId(int) (I)V
    • int indexOf(char[],int ) ([CI)I

文件结构-attribute

  • 在field和method中,可以有若干个attribute,类文件也有attribute,用于描述一些额外的信息
    • attribute_name_index u2
      • 名字,指向常量池UTF-8
    • attribute_length u4
    • 长度
    • info[attribute_length] u1
      • 内容
  • attribute本身也可以包含其他attribute
  • 随着JDK的发展不断有新的attribute加入

  • Deprecated
    • attribute_name_index u2
    • attribute_length u4
  • attribute_name_index
    • 指向包含Deprecated的UTF-8常量
  • attribute_length

    • 为0
  • ConstantValue

    • attribute_name_index u2
    • attribute_length u4
    • constantvalue_index u2
  • attribute_name_index

    • 包含ConstantantValue字面量的UTF-8索引
  • attribute_length

    • 为2
  • constantvalue_index

    • 常量值,指向常量池,可以是UTF-8,Float, Double 等

  • Code

  • LineNumberTable – Code属性的属性

  • LocalVariableTable – Code属性的属性

  • Exceptions属性
    • 和Code属性平级
    • 表示方法抛出的异常(不是try catch部分,而是 throws部分)
  • 结构
    • attribute_name_index u2
    • attribute_length u4
    • number_of_exceptions u2
    • exception_index_table[number_of_exceptions] u2
      • 指向Constant_Class的索引

  • SourceFile
    • 描述生成Class文件的源码文件名称
  • 结构
    • attribute_name_index u2
    • attribute_length u4
      • 固定为2
  • soucefile_index u2
    • UTF-8常量索引

Class文件结构例子