zoukankan      html  css  js  c++  java
  • 深入理解JVM(六)类文件结构

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

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

      

      

        

      

  • 相关阅读:
    SpringCloud入门
    SpringBoot自动配置的演示
    SpringBoot自动配置原理
    SpringBoot整合Junit、Mybatis以及Redis
    SpringBoot介绍
    面向对象编程
    Spring MVC介绍
    Queue
    springcloud项目 报错数据库未配置
    linux环境下mongoDB主从复制搭建
  • 原文地址:https://www.cnblogs.com/lcmlyj/p/10157037.html
Copyright © 2011-2022 走看看