类文件结构

2018-03-19  本文已影响0人  icelovesummer

class文件结构

ClassFile{
magic                        u4,
minor_version                u2,
major_version                u2,
constant_pool_count            u2,
constant_pool                cp_info*constant_pool_count,
access_flags                 u2,
this_class                   u2,
super_class                  u2,
interface_count              u2,
interfaces                   u2 * interface_count,
fields_count                 u2,
fields                      field_info * fields_count,
methods_count                u2,
methods                      method_info * methods_count,
attributes_count             u2,
attributes                   attributes_info * attributes_count
}

magic(魔数) u4

minor_version/major_version(次版本号和主版本号) u2 u2

constant_pool_count/constant_pool(常量池数量和常量池) u2

access_flags(访问标志) u2

类索引、父类索引与接口索引集合 u2 u2 u2表

字段表集合

field_info
{ 
    u2      access_flags; 
    u2      name_index;     //字段的简单名称
    u2      descriptor_index;     //字段和方法的描述符
    u2      attributes_count; 
    attributes_info * attributes_cout      attributes               
} 
字段访问标志 描述符标识字符含义

方法表集合

方法表的结构

属性表集合

code属性
  1. attribute_name_index是一项指向CONSTANT_Utf8_info型常量的索引,常量值固定为“Code”,它代表了该属性的名称。
  2. attribute_length指示了属性值的长度,由于属性名称索引与属性长度一共是6个字节,所以属性值的长度固定为整个属性表的长度减去6个字节。
  3. max_stack代表了操作数栈深度的最大值。
  4. max_locals代表了局部变量表所需的存储空间,它的单位是Slot,并不是在方法中用到了多少个局部变量,就把这些局部变量所占Slot之和作为max_locals的值,原因是局部变量表中的Slot可以重用。
  5. code_length和code用来存储Java源程序编译后生成的字节码指令。code用于存储字节码指令的一系列字节流,它是u1类型的单字节,因此取值范围为0×00到0xFF,那么一共可以表达256条指令,目前,Java虚拟机规范已经定义了其中200条编码值对应的指令含义。code_length虽然是一个u4类型的长度值,理论上可以达到2^32-1,但是虚拟机规范中限制了一个方法不允许超过65535条字节码指令,如果超过了这个限制,Javac编译器将会拒绝编译。
  6. 异常表: 如果字节码从第start_pc行到第end_pc行之间(不含end_pc行)出现了类型为catch_type或其子类的异常(catch_type为指向一个CONSTANT_Class_info型常量的索引),则转到第handler_pc行继续处理,当catch_pc的值为0时,代表任何的异常情况都要转到handler_pc处进行处理。
异常表
expections属性
LineNumberTable属性
LocalVariableTable属性
SourceFile属性
ConstantVaule属性

【final、static、static final修饰的字段赋值的区别】

InnerClasses属性
上一篇 下一篇

猜你喜欢

热点阅读