程序员社区

(JVM面试题)可以描述一下 class 文件的结构吗?

Class 文件包含了 Java 虚拟机的指令集、符号表、辅助信息的字节码(Byte Code),是实现跨操作系统和语言无关性的基石之一。

一个 Class 文件定义了一个类或接口的信息,是以 8 个字节为单位,没有分隔符,按顺序紧凑排在一起的二进制流。

用 "无符号数" 和 "表" 组成的伪结构来存储数据。

  • 无符号数:基本数据类型,用来描述数字、索引引用、数量值、字符串值,如u1、u2 分别表示 1 个字节、2 个字节
  • 表:无符号数和其他表组成,命名一般以 "_info" 结尾

成部分
1、魔数 Magic Number

  • Class 文件头 4 个字节,0xCAFEBABE
  • 作用是确定该文件是 Class 文件

2、版本号

  • 4 个字节,前 2 个是次版本号 Minor Version,后 2 个主版本号 Major Version
  • 从 45 (JDK1.0) 开始,如 0x00000032 转十进制就是 50,代表 JDK 6
  • 低版本的虚拟机跑不了高版本的 Class 文件

3、常量池

  • 常量容量计数值(constant_pool_count),u2,从 1 开始。如 0x0016 十进制 22 代表有 21 项常量
  • 每项常量都是一个表,目前 17 种
  • 特点:Class 文件中最大数据项目之一、第一个出现表数据结构

4、访问标志

  • 2 个字节,表示类或接口的访问标志

5、类索引、父类索引、接口索引集合

  • 类索引(this_class)、父类索引(super_class),u2
  • 接口索引集合(interfaces),u2 集合
  • 类索引确定类的全限定名、父类索引确定父类的全限定名、接口索引集合确定实现接口
  • 索引值在常量池中查找对应的常量

6、字段表(field_info)集合

  • 描述接口或类申明的变量
  • fields_count,u2,表示字段表数量;后面接着相应数量的字段表
  • 9 种字段访问标志

7、方法表(method_info)集合

  • 描述接口或类申明的方法
  • methods_count,u2,表示方法表数量;后面接着相应数量的方法表
  • 12 种方法访问标志
  • 方法表结构与字段表结构一致

8、属性表(attribute_info)集合

  • class 文件、字段表、方法表可携带属性集合,描述特有信息
  • 预定义 29 项属性,可自定义写入不重名属性

file

Java面试题

赞(0) 打赏
未经允许不得转载:IDEA激活码 » (JVM面试题)可以描述一下 class 文件的结构吗?

一个分享Java & Python知识的社区