JVM深入浅出(6)--- 类文件结构

自己在学习《深入理解Java虚拟机:JVM高级特性与最佳实践(第3版) (华章原创精品) - 周志明》时的一些思考和总结

1. 无关性的基石

  • 平台无关性
    • 字节码是构成平台无关性的基石,不同平台的java虚拟机,都统一支持的程序存储格式--字节码
  • 语言无关性
    • 不管是什么语言,只要能编译成class文件,就能被jvm的字节码解释器运行
      image-20260213141244588

2. Class类文件的结构

一个class文件对应着唯一一个类或者接口的定义信息

class文件是以八字节为基础单位的二进制字节流,各类数据按顺序摆放

image-20260213141749892
class文件中只有两种数据结构

  • 无符号数
    • 无符号数包括u1,u2,u4,u8 分别代表占用1字节,2字节,4字节,8字节。无符号数可以用来描述数字、索引引用、数量值或者按照UTF-8编码构成字符串 值
    • 表是以无符号数和表构成的一种复杂数据结构,通常以_info结尾。class文件也可以看作是一张表。

2.1 魔数与Class文件的版本

  • 魔术:
    • 最开始的四个字节是魔术,魔术是验证该文件是否为被虚拟机所接受的Class文件,值是0xCAFEBABE(魔术也可以验证其他类型文件)。
  • 版本号
    • 接下来的四个字节是class文件的版本号,前面 2 字节是次版本号,后面 2 字节是主版本号。高版本的JDK接受运行向下兼容的版本号,但是不能运行超过版本号的

2.2 常量池

常量池是class文件中的资源仓库,由于常量池的大小不是固定的,通常开头的两个字符是常量池的数目。

注意常量池索引是数目是从1开始算的(其他,比如接口索引集合,字段表,方法表都是从0开始算的),留0的原因是为了表示该引用未使用常量池中任何元素。

常量池中主要放的是字面量符号引用

  • 字面量通常就是一些模板字符串,final定义的常量

  • 符号引用通常包括这些,这些引用将会通过动态链接的方式,由符号引用转化成内存中的实际引用

    • 模块导出或者开放的包

    • 类和接口的完全限定名

    • 字段的名称和描述符

    • 方法的名称和描述符

    • 方法句柄和方法类型(方法句柄就是去定位某个方法然后使用,类似于方法的反射)。

    • 动态调用点和动态常量

常量池中的每个元素都是一张表,而常量池中的表有着不同种的表结构

image-20260213143543797

2.3 访问标志

接下来的两个字节是访问标志,用于识别一些类或 者接口层次的访问信息,表示这个class文件代表的是类还是接口,是public的吗,是否为abstract,如果是类是否为final的。

posted @ 2026-04-07 16:59  不会coding的喵酱  阅读(1)  评论(0)    收藏  举报