JVM class 文件结构

class 文件的结构如下:

ClassFile {
    u4          magic;
    u2          minor_version;
    u2          major_version;
    u2          constant_pool_count;
    cp_info     contant_pool[constant_pool_count – 1];
    u2          access_flags;
    u2          this_class;
    u2          super_class;
    u2          interfaces_count;
    u2          interfaces[interfaces_count];
    u2          fields_count;
    field_info      fields[fields_count];
    u2          methods_count;
    method_info     methods[methods_count];
    u2          attributes_count;
    attribute_info  attributes[attributes_count];
}
Constant Pool

每个Constant Pool Entry由cp_info结构来表示

cp_info {
    u1 tag;
    u1 info[];
}

tag 表示constant type:

Constant Type Value
CONSTANT_Class 7
CONSTANT_Fieldref 9
CONSTANT_Methodref 10
CONSTANT_InterfaceMethodref 11
CONSTANT_String 8
CONSTANT_Integer 3
CONSTANT_Float 4
CONSTANT_Long 5
CONSTANT_Double 6
CONSTANT_NameAndType 12
CONSTANT_Utf8 1
CONSTANT_MethodHandle 15
CONSTANT_MethodType 16
CONSTANT_InvokeDynamic 18

不同tag对应的info[]不同。

类的属性

access_flags :类的访问属性
this_class:index to constant pool,指向一个CONSTANT_Class_info。当前类
super_class:index to constant pool(0或者valid index),指向一个CONSTANT_Class_info。当前类的父类

interface

interfaces:index to constant pool,指向一个CONSTANT_Class_info,当前类实现的接口。

fields

field_info的数组:

field_info {
    u2             access_flags;
    u2             name_index;    //index to constant pool, field的name
    u2             descriptor_index; //index to constant pool, field的type
    u2             attributes_count;
    attribute_info attributes[attributes_count];
}
methods
method_info {
    u2             access_flags;
    u2             name_index;
    u2             descriptor_index;
    u2             attributes_count;
    attribute_info attributes[attributes_count];
}

method_info中的attribute_info包括:Code , Exceptions , Synthetic , Signature , Deprecated , RuntimeVisibleAnnotations , RuntimeInvisibleAnnotations , RuntimeVisibleParameterAnnotations , RuntimeInvisibleParameterAnnotations , AnnotationDefault

其中Code attribute_info包含了method的字节码:

Code_attribute {
    u2 attribute_name_index;
    u4 attribute_length;
    u2 max_stack;
    u2 max_locals;
    u4 code_length;
    u1 code[code_length];    //字节码保存在这里
    u2 exception_table_length;
    {   u2 start_pc;
        u2 end_pc;
        u2 handler_pc;
        u2 catch_type;
    } exception_table[exception_table_length];
    u2 attributes_count;
    attribute_info attributes[attributes_count];
}
attributes

包含了当前class的一些attribute_info

Reference:

https://docs.oracle.com/javase/specs/jvms/se7/html/jvms-4.html

推荐阅读更多精彩内容

  • 一.Class文件 注意:任何一个Class文件都对应着唯一一个类或接口的定义信息,但反过来说,类或接口并不一定都...
    慕涵盛华阅读 643评论 2 5
  •  在《JAVA CLASS的文件结构(规范篇)》中我们基本完整的描述了class的文件结构规范,这一篇我们以一个实...
    SunnyMore阅读 853评论 0 1
  • class文件结构 Class文件存储的内容称为字节码(ByteCode),包含了JVM指令集和符号表以及若干其他...
    FantJ阅读 662评论 0 2
  •  每一个class文件都对应着唯一一个类或者接口的定义信息,但是相对地,类或者接口并不一定都必须定义在文件里(比如...
    SunnyMore阅读 5,385评论 0 1
  • Java是一种可以撰写跨平台应用软件的面向对象的程序设计语言。Java 技术具有卓越的通用性、高效性、平台移植性和...
    Java小辰阅读 820评论 0 1
  • 讨厌在黑夜中清醒,却又出奇的喜欢在白天里沉睡。白天黑夜、清醒沉睡如此背道而驰只有晨昏线和闹钟才会让它们有交集的两组...
    阿纯_阅读 92评论 0 1
  • 万维钢 日课248丨哪种睡眠最宝贵 今天咱们继续说史托伯格和马格内斯的《巅峰表现》。几十年以前的人从来不认为睡眠是...
    胡小勇阅读 786评论 0 0
  • 烦扰几天的失声、咽喉痒痛,从昨天开始好转,我便迫不及待地扔掉话筒,轻装上阵继续投入工作。 随着嗓子回声,心情也跟着...
    爱如你我阅读 170评论 0 3