深入理解JVM(六)类文件结构

时间:2024-01-11 16:55:38

6.1 关于类文件

  1.class文件的一次编译,到处运行的跨平台性; 

  2.JVM不止有跨平台性,还有跨语言性,不管是JRuby还是Groovy写出来的程序,只要编译出符合JVM规范的class文件就可以在JVM上运行;

6.2 类文件结构

  PS:任何一个Class文件都对应一个类或者接口,但是一个类或者接口不一定都得定义在文件里,因为有类加载器的存在可以;

  CLass文件结构的两部分:(1)无符号数:u1、u2、u4、u8(数字代表所占的字节数),数字、索引引用;(2)表:_info;

  1.魔数:

    (1)每个Class文件的头四个字节u4: 0xCAFEBABE ,用于标志Class文件;

    (2)第五第六字节:次版本号Minor Version,第七第八字节:主版本号:Major Version,主版本号决定了高版本JDK可以兼容运行低版本Class文件,但是低版本JDK不能运行高版本Class文件;

  2.常量池:

    (1)常量池入口位于主版本号之后;

    (2)两大常量:①字面量(更接近Java中的常量定义);②符号引用:类和接口的全限定名(Fully-Qualified Name)、字段的名称和描述符(Descriptor)、方法的名称和描述符;

  3.访问标志falg:

    常量池后面两位,用于表示是否是:public、final、super、interface、abstract等修饰的类;ACC_xxxx所修饰;

  4.类索引(this_class)、父索引(super_class)、接口索引(interfaces):

    (1)类索引和父索引都是一个u2类型的数据,而接口索引是u2类型的数据集合;

    (2)类索引和父索引各自 -> 类描述常量 CONSTANT_CLass_info  ->  CONSTANT_Utf8_info ;

  5.字段表集合(field_info)

    (1)用于描述接口或类中的变量,不包括局部变量,用于表示其:作用域(public、private、protected)、静态(static)、常量(final)、数据类型(基本数据类型、数组、对象);

    (2)字段表结构:① access_flags :表示字段修饰符,u2数据类型;② name_index :简单名称(变量的名称),是对常量池的引用;③ descripter_index :描述符(描述字段的数据类型,在方法表中是描述参数的列表和返回值),也是对常量池的引用 ;④  attribute_info :最后是属性表,存储额外的信息,比如变量的初始值;

  6.方法表集合

    结构和字段表类似,只是用于表示方法,方法中的代码内容保存在属性表 attribute_info的Code属性中;

  7.属性表集合

6.3字节码指令

   JVM的字节码指令由以下构成:①操作码:一个字节长度的数字,代表着某种操作;②操作数:紧跟操作码后面的零至多个的参数,代表此操作需要的参数;

  字节码指令包括:加载和存储指令(栈帧中局部变量表和操作数栈之间的来回传输),运算指令(两个操作数栈上的值进行运算加减乘除等),类型转换指令,对象创建于访问指令,操作数栈管理指令(出栈、复制栈顶、栈顶两个数值互换),控制转移指令(条件分支、复合条件分支、无条件分支),方法调用和返回指令,异常处理指令