Class文件结构

本文详细解析了Java Class文件的结构,包括魔数、版本号、常量池、访问标志、字段表、方法表、属性表等关键元素。探讨了如code、Exception、LineNumberTable等属性的作用,以及它们在Java运行时的重要性。通过对Class文件的剖析,有助于深入理解Java虚拟机的工作原理。
摘要由CSDN通过智能技术生成

Class文件结构

  • 以一组8字节为基础的二进制流,各个数据项严格按照顺序紧凑排列在Class文件中,中间没有添加任何分隔符,整个Class文件中存储的内容几乎全部都是运行时必要的文书,没有空隙存在

  • 当遇到8位字节以上的空间数据项是,则会按照高位在前的方式分割成若干个8位字节进行存储

  • Class文件中有两种数据类型,分别是无符号数(基本数据类型)和表(引用数据类型)

  • 魔数

    • 开头的四个字节,识别字节码文件的标识(CAFEBABE)
    • jdk1.8–>52
    • jdk1.7–>51
  • Class文件版本

    • 魔数后面为次版本号(5-6个字节)、主版本号 (7-8个字节)从45开始
  • 常量池

    • 紧接着主版本号
    • 字面量
      • final值,文本字符串……
    • 符号引用
      • 类和接口全限名,字段名称、描述符,方法名称描述符
    • javap -verbose Hello.class
  • 访问标志

    • access_flags
    • 表示标识符,多个标识符用or连接
  • 类索引、父类索引,接口索引集合

    • 获取父类,接口信息
  • 字段表集合

    • 描述接口或类中申明的变量,包括类级变量以及实力级变量。
    • 不会列出从父类继承来的字段。
  • 方法表集合

    • 访问标志,名称索引,描述符索引,属性表集合
  • 字段表集合

    • 描述方法申明的变量
  • 属性表集合

    • 描述额外的属性信息
    • code属性:经过javac编译后,最终装换为字节码指令存储在code属性内。code属性出现在方法表的属性集合中。
    • Excepiton属性:举例列出方法中可能抛出的受查异常,也就是方法描述时在throws关键字后面列举的异常。
    • LineNumberTable属性:用于java源码行号与字节码行号之间的对应关系。
    • LocalVariableTable属性:描述栈帧表中的变量与java源码中定义的变量之间的关系。
    • SourceFile属性:记录生成这个Class文件源码文件名称。
    • ConstantValue属性:通知虚拟机自动为静态变量赋值。
      • 非static变量:在实例构造器初始化。
      • final static :生成ConstantValue属性初始化。
      • static :类初始化方向进行。
    • InneClass属性:记录内部类与宿主类间的关系。
    • Deprecated及Synthetic属性
      • Deprecated表示过时字段,类,方法,由java源码产生
      • Synthetic表示一个类、字段或者方法由编译器自动产生。
    • StaticMap Table属性
      • 复杂的边长参数,位于Code属性的属性表中。
      • 会在虚拟机类加载的字节码验证阶段被新类型检查验证器使用。
      • 属性中包含零至多个栈映射帧,每个栈映射帧都是显示或隐式地代表了一个字节码偏移量,用于表示该执行到该字节码时局部变量表和操作数栈的验证类型。
    • Signature属性:记录泛型前面信息
    • BootstrapMethods属性:保存用于invokedynamic指令引用的引导方法限定符。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值