java类文件结构

1.虚拟机并不关心Class的来源是什么语言,只要符合Class文件应有的结构就可以在java虚拟机中运行。(例如java源程序和JRuby源程序都可以通过各自的编译器编译成.class文件运行在java虚拟机上。)

     Class文件是一组以8位字节为基础单位的二进制流。Class文件结构采用类C语言的伪结构,这种伪结构只有两种数据类型:无符号数和表。

     无符号数属于基本数据类型,u1,u2,u4,u8分别代表1个字节,2个字节,4个字节,8个字节。表是由多个无符号数或其他表作为数据项构成的复合数据类型。

     当需要描述同一类型但数量不定的多个数据时,经常会使用一个前置的容量计数器加若干连续的数据项的形式。

Class文件的前4个字节为魔数,值为"0xCAFEBASE",被虚拟机识别。第5个6个字节为次版本号,7,8个字节为主版本号。高版本的jdk能向下兼容低版本的Class文件,但不能运行以后的class文件。

常量池:
    主版本和次版本之后的是常量池。常量池入口处为u2类型的常量池计数器(constant_pool_count),计数从1开始。常量池主要存放两大类常量:字面量(文本字符串、被声明为final的常量值)和符号引用。符号引用主要指:
类和接口的全限定名、字段的名称和描述、方法的名称和描述符。
当虚拟机运行时,需要从常量池获得对应的符号引用,在类创建时或运行时解析并翻译到具体的内存中。

访问标志:常量池结束之后的2个字节表示访问标志(access_flag),用于识别类和接口层次的信息。如:这个Class是类还是接口,是否定义为public类型,是否定义为abstract类型,是否声明为final类型等等。

类索引、父类索引与接口索引:
   类索引和父类索引都是一个u2类型的数据,而接口索引是一组u2类型的数据的集合。类索引用于确定这个类的全限定名,父类索引用于确定这个类的父类的全限定名。接口索引集合就是用来确认这个类实现了哪些接口。类索引、父类索引和接口索引集合都按顺序排列在访问标志之后。

字段表集合:
    字段表用于描述接口或类中声明的变量,可以包含的信息有字段的作用域(public,protected,private),是类级变量(static)还是实例级变量,
    final以及并发可见性(volatile)、是否序列化。
    字段表中的access_flag与类中的access_flag项目非常类似,跟随access_flag标志的是name_index和descriptor_index,它们都是对常量池的引用,
分别代表字段的简单名称及字段和方法的描述符。 如:com/test/latty/TestClass为类的全限定名,简单名称就是没有类型或参数修饰的方法或字段名称如:类中inc()方法
和m字段的简单名称分别为"inc"和"m"。

描述符是用来描述字段的数据类型、方法的参数列表和返回值。

对于数组类型,每一纬度使用"["来表示。 如java.lang.String[][]类型的描述符为"[[Ljava/lang/String;",方法"void inc()"的描述符为"()V",
方法java.lang.String toString方法的描述符为"()Ljava/lang/String;"

字段表集合不会列出超类或者从父接口中继承而来的字段。

方法表的集合:
方法表的结构如同字段表一样依次包含了access_flags,名称索引(name_index)、索引符索引(descriptor_index)、属性表集合(attributes).
方法里的java代码,经过编译器编译成字节码指令之后,存放在方法属性表集合中一个名为"Code"的属性中。
要重载一个方法,必须有一个与原方法不同的特征签名,特征签名就是一个方法中各个参数在常量池中字段符号引用的集合。

属性表集合:
属性表集合不要求长度和顺序等,只要不与已有属性名重复,任何人都可以向属性表中写入自己定义的属性信息。
        Code属性:方法体里面的代码经过编译成的字节码指令存储在Code属性中。Code属性出现在方法表的属性集合中。
        Code属性表中max_stack代表了操作树栈深度的最大值,max_locals:代表了局部变量表所需的存储空间。存储单位是Slot
        长度不超过32位的局部变量,每个局部变量占用1个Slot,double和long两种64位的数据类型需要2个Slot来存储。
        code_length:code属性表中代表字节码长度,是一个u4类型,限制了一个方法不能超过65535条字节码指令,如果超出,javac编译器拒绝编译。
       


你可能感兴趣的:(jvm,虚拟机,类文件结构)