Java教程

Java 类文件结构

本文主要是介绍Java 类文件结构,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

Java类文件结构

《深入理解Java虚拟机》第六章-类文件结构

  1. 无关性 – 平台无关性

    • 基石:各个平台统一的字节码+各个平台适配的虚拟机

    • 其他语言也可用java虚拟机,只要编译为class即可

      • 虚拟机不与任何语言(包括java)绑定,只与字节码关联
      • 字节码能提供比java更多的语言特性,让别的语言可以翻译为字节码
    • 在这里插入图片描述

  2. class类文件结构

    • 数据类型:无符号数(u1, u2, u4, u8 – 1、2、4、8个字节) & 表 (_info)结尾

      • 在这里插入图片描述
      • 在这里插入图片描述
    1. 魔数与class文件版本

      • 0xCAFABABY
      • 魔数后4个字节为次版本号和主版本号
    2. 常量池

      • 字面量和符号引用(类似编译原理)

      • 注意没有C的链接步骤,字节码中无法得到内存布局

      • 每个常量都是一个表

        • 注意此处找class名的例子
      • 在这里插入图片描述

    3. 访问标志

      • 识别类或接口的访问信息
    4. 类索引、父类缩影、接口索引集合

      • 索引值指向CONSTANT_Class_info类描述符,类描述符可以找到CONSTANT_Utf8_info的全限定名字符串
    5. 字段表集合

      • 描述接口或者类声明的变量

      • 作用域(public/private/protected)、实例变量类变量(static)、可否序列化、字段数据类型、字段名称

      • 数组[

      • int[] – [I

      • 描述方法

        • 先参数后返回值

          • void inc() – ()V
          • java.lang.String toString() – ()Ljaja.lang.String;
    6. 方法表集合

      • 类似字段表集合
      • 方法体的字节码在Code属性里
    7. 属性表集合

      • class文件、字段表、方法表都可以有自己的属性表集合
      1. Code属性
      2. Exceptions属性
      3. LineNumberTable属性 – 行号对应
      4. LocalVariableTable和LocalVariableTypeTable属性 – 参数名称对应
      5. SourceFile和SourceDebugExtension属性 – 源码名称
      6. ConstValue属性 – 虚拟机自动为静态变量赋值
      7. InnerClass属性 – 内部类和宿主类关系
      8. Depraecated和Synthetic属性 – 遗弃代码或者编译产生代码
      9. StackMapTable属性 – 类型检查验证器使用
      10. Signature属性 – 泛型(擦除法)反射可用
      11. BootstrapMethods属性
      12. MethodParameters属性 – 参数对应,为了无实体方法使用
      13. 模块化属性
      14. 运行时注解
  3. 字节码指令简介

    • java 面向操作数栈而非面向寄存器的架构
    • 加载存储指令
    1. 基本流程

      • do {
            PC寄存器+1
            根据PC寄存器的值,从字节码流中取出操作码
            if(字节码存在操作数) -> 从字节码流中取出操作数
            执行操作码定义的操作
        }while(字节码流长度>0)
        
      • 字节码于数据类型

        • iload – int, fload – float,最开始为助记符

        • 操作码只有一字节,所以操作码有限

          • 并非每种数据类型和每一种操作都有对应的指令。一些单独的指令可以在必要的时候把不受支持的类型转为受支持的类型
          • 编译期将boolean、byte、short等转为int类型数据,使用对应int类型字节码指令处理。
    2. 加载存储指令

      • iload、lload、fload…
      • istore、lstore、fstore
      • 加载常量到操作数栈: bipush、sipush、iconst_m1
    3. 运算指令

      • iadd, isub, imul, idiv, irem(求余), ineg(取反)…
    4. 类型转换指令

    5. 对象创建与访问指令

      • new, newarray, getfield, getstatic, baload…
    6. 操作数栈管理指令

      • pop, dup
    7. 控制转移指令

      • goto…
    8. 方法调用与返回指令

      • invokevirtual:调用对象实例方法(最常用)
      • invokeinterface:调用接口方法
      • invokespecial:调用实例初始化、私有方法、父类方法
      • invokestatic:调用类静态方法
      • invokedynamic:动态解析限定符指示方法
    9. 异常处理指令

    10. 同步指令

  4. 公有设计,私有实现

  5. class文件结构的发展

    • 二十年变化很小
这篇关于Java 类文件结构的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!