《深入理解JAVA虚拟机》学习笔记(五)CLASS文件结构

虚拟机都可以载入和执行同一种平台无关的字节码,从而实现了程序的一次编写,到处运行各种不同平台的虚拟机与所有平台都统一使用的程序存储格式——字节码(ByteCode)是构成平台无关性的基石,但本节标题中刻意省略了“平台”二字,那是因为笔者注意到虚拟机的另外一种中立特性——语言无关性正越来越被开发者所重视。 实现语言无关性的基础仍然是虚拟机和字节码存储格式。 Java虚拟机不和包括Java在内的任何语言绑定,它只与“Class文件这种特定的二进制文件格式所关联,Class文件中包含Java虚拟机指令集和符号表以及若干其他辅助信息。 基于安全方面的考虑,Java虚拟机规范要求在Class文件中使用许多强制性的语法和结构化约束,但任一门功能性语言都可以表示为一个能被Java虚拟机所接受的有效的Class文件。 

Class类文件的结构

Class文件是一组以8位字节为基础单位的二进制流,各个数据项目严格按照顺序紧凑地排列在Class文件之中,中间没有添加任何分隔符,这使得整个Class文件中存储的内容几乎全部是程序运行的必要数据,没有空隙存在。 当遇到需要占用8位字节以上空间的数据项时,则会按照高位在前的方式分割成若干个8位字节进行存储.

Class文件格式 只有两种数据类型:无符号数和表

《《深入理解JAVA虚拟机》学习笔记(五)CLASS文件结构》

magic
魔数
minor_version次版本号
major_version主版本号
constant_pool_count常量池容量
constant_pool常量池
access_flags访问标志
this_class类索引
super_class父类索引
interface_count接口数
interface接口索引集合
fields_count字段表容量
fields字段表集合
methods_count方法表容量
methods方法表集合
attributes_count
属性表容量
attributes
属性表集合

1、
魔数 、版本号

每个Class文件的头4个字节称为魔数(Magic Number),它的唯一作用是确定这个文件是否为一个能被虚拟机接受的Class文件。紧接着魔数的4个字节存储的是Class文件的版本号:第5和第6个字节是次版本号(Minor
Version
),第7和第8个字节是主版本号(Major Version 。

2、常量池

常量池中主要存放两大类常量:字面量(Literal)和符号引用(Symbolic References)。字面量比较接近于Java语言层面的常量概念,如文本字符串、 声明为final的常量值等。 而符号引用则属于编译原理方面的概念,包括了下面三类常量:类和接口的全限定名,字段的名称和描述符,方法的名称和描述符。

3、访问标志

这个标志用于识别一些类或者接口层次的访问信息,包括:这个Class是类还是接口;是否定义为public类型;是否定义为abstract类型;如果是类的话,是否被声明为final 

4、类索引、 父类索引与接口索引集合
Class文件中由这三项数据来确定这个类的继承关系。 类索引用于确定这个类的全限定名,父类索引用于确定这个类的父类的全限定名 

5、字段表集合

字段表(field_info)用于描述接口或者类中声明的变量。 字段(field)包括类级变量以及实例级变量,但不包括在方法内部声明的局部变量。可以包括的信息有:字段的作用域(public、 private、 protected修饰符)、 是实例变量还是类变量(static修饰符)、 可变性(final)、 并发可见性(volatile修饰符,是否强制从主内存读写)、 可否被序列化(transient修饰符)、 字段数据类型(基本类型、 对象、 数组)、 字段名称。
6、方法表集合

Class文件存储格式中对方法的描述与对字段的描述几乎采用了完全一致的方式,方法表的结构如同字段表一样,依次包括了访问标志(access_flags)、 名称索引(name_index)、 描述符索引(descriptor_index)、 属性表集合(attributes)几项 
7、属性表集合

Class文件、 字段表、 方法表都可以携带自己的属性表集合,以用于描述某些场景专有的信息
典型的用法是保存方法代码


    原文作者:java虚拟机
    原文地址: https://blog.csdn.net/u013547284/article/details/71056809
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞