详见: http://wiki.jikexueyuan.com/project/java-vm/class.html
Class 文件中各数据项是按照上表的顺序和数量被严格限定的,每个字节代表的含义、长度、先后顺序都不允许改变。
1、 magic 与 version
每个 Class 文件的头 4 个字节称为魔数(magic),它的唯一作用是判断该文件是否为一个能被虚拟机接受的 Class 文件。它的值固定为 0xCAFEBABE。紧接着 magic 的 4 个字节存储的是 Class 文件的次版本号和主版本号,高版本的 JDK 能向下兼容低版本的 Class 文件,但不能运行更高版本的 Class 文件。
2、constant_pool
major_version 之后是常量池(constant_pool)的入口,它是 Class 文件中与其他项目关联最多的数据类型,也是占用 Class 文件空间最大的数据项目之一。
常量池中主要存放两大类常量:字面量和符号引用。字面量比较接近于 Java 层面的常量概念,如文本字符串、被声明为 final 的常量值等。而符号引用总结起来则包括了下面三类常量:
- 类和接口的全限定名(即带有包名的 Class 名,如:org.lxh.test.TestClass)
- 字段的名称和描述符(private、static 等描述符)
- 方法的名称和描述符(private、static 等描述符)
虚拟机在加载 Class 文件时才会进行动态连接,也就是说,Class 文件中不会保存各个方法和字段的最终内存布局信息,因此,这些字段和方法的符号引用不经过转换是无法直接被虚拟机使用的。当虚拟机运行时,需要从常量池中获得对应的符号引用,再在类加载过程中的解析阶段将其替换为直接引用,并翻译到具体的内存地址中。
3、 ConstantValue 属性
如果同时使用 final 和 static 修饰一个变量(即全局常量),并且这个变量的数据类型是基本类型或 String 的话,就生成 ConstantValue 属性来进行初始化(编译时 Javac 将会为该常量生成 ConstantValue 属性,在类加载的准备阶段虚拟机便会根据 ConstantValue 为常量设置相应的值),如果该变量没有被 final 修饰,或者并非基本类型及字符串,则选择在方法中进行初始化。
下面简要说明下 final、static、static final 修饰的字段赋值的区别:
- static 修饰的字段在类加载过程中的准备阶段被初始化为 0 或 null 等默认值,而后在初始化阶段(触发类构造器)才会被赋予代码中设定的值,如果没有设定值,那么它的值就为默认值。
- final 修饰的字段在运行时被初始化(可以直接赋值,也可以在实例构造器中赋值),一旦赋值便不可更改;
- static final 修饰的字段在 Javac 时生成 ConstantValue 属性,在类加载的准备阶段根据ConstantValue的值为该字段赋值,它没有默认值,必须显式地赋值,否则 Javac 时会报错。可以理解为在编译期即把结果放入了常量池中。
相关推荐
#### 四、Class文件结构的意义 Class文件结构的设计充分考虑了灵活性和高效性。一方面,通过严格的结构定义,使得JVM可以准确无误地解析Class文件;另一方面,通过使用可变长度的数据结构(如常量池、字段表集合等...
Java 类文件结构是Java虚拟机(JVM)执行字节码的基础,它的核心部分就是类文件,其中包含了关于类和接口的各种元数据。类文件的结构严格定义,以确保跨平台的兼容性。这里我们将详细探讨类文件结构中的常量池、常量...
在深入理解BMP文件结构之前,我们需要知道它是一种未压缩的图像格式,这意味着文件大小通常较大,但优点是图像质量不受压缩影响。 **BMP文件头** BMP文件头由两部分组成:File Header(文件头)和InfoHeader(信息...
#### 四、MIDI文件结构详解 MIDI文件本质上是一种二进制文件,其核心功能在于记录音乐播放过程中音序器需要向音源发送的指令及其时间点。此外,还包括一些辅助信息,如版权信息、音轨名称、速度信息等,统称为Meta-...
在C#编程中,生成类文件的文档是提高代码可读性和维护性的重要步骤。类文档不仅方便开发者理解和使用API,还可以减少代码注释的工作量。本话题将深入探讨如何自动生成C#类中的属性和方法的文档,以及涉及到的相关...
### C++程序的文件结构详解 #### 一、引言 C++作为一种广泛使用的编程语言,在软件开发领域占据着重要地位。随着项目的复杂度增加,合理地组织代码变得尤为重要。本文将详细介绍C++程序的文件结构,帮助读者理解...
Java 类文件结构是Java虚拟机(JVM)执行的基础,它包含了构成Java程序的所有必要信息。Class文件是一种二进制格式,由8位字节组成,数据紧密排列,没有额外的分隔符,确保高效存储。Class文件由一系列的数据项组成...
前四个字节通常是"DEX\0037\000",表示这是Dex文件格式的版本号,其中'\0037'对应于0x37,代表版本号0.37。 2. **checksum**:4字节的CRC32校验和,用于验证文件的完整性和正确性。这个值覆盖了Dex文件的全部内容,...
二、Dex文件结构 1. 头部:Dex文件的开头是固定大小的头部,包含了文件的基本信息,如文件版本、字符串索引表、类型索引表、字段索引表等的位置和大小。 2. 字符串索引表:存储所有字符串常量,通过一个16位的索引值...
其中包含2002、2011、2017三年国民经济行业分类和代码的MySQL文件,每一个表的格式如下:例如第一列是“ A0111 ”,那么第二列就是“ 农、林、牧、渔业·农业·谷物及其他作物的种植·谷物的种植 ”,三年的行业代码...
《JVM系列之一:深入理解类文件结构》 Java虚拟机(JVM)是Java程序的核心执行环境,它负责解释和执行字节码。本文将详细剖析JVM中的类文件结构,这是理解Java程序运行机制的基础。 首先,每个Java源代码文件编译...
理解BMP文件结构对于开发图像处理软件或进行图像数据操作至关重要。开发者可以通过解析这些头部信息来读取和写入BMP文件,从而实现对图像的显示、编辑或转换。此外,由于BMP文件格式是无损的,它常用于保存原始图像...
1. **Java类文件结构**:首先,了解Java类文件的内部结构至关重要。每个Java类文件都是以`.class`后缀的二进制文件,它由魔数、版本号、常量池、访问标志、类索引、父类索引、接口索引集合、字段表集合、方法表集合...
### Class文件结构组成详解 #### 一、Class文件概述 Class文件是Java程序编译后的产物,由编译器生成并被Java虚拟机(JVM)加载执行。它以8位字节流的形式组织数据,共包含15个有意义的组成部分。每个部分紧密相连,...
通过对`class`文件结构的深入理解,我们可以更好地掌握Java类在字节码层面上的组织方式,这对于理解Java虚拟机的工作原理至关重要。此外,熟悉这些细节也有助于我们编写更高效、更安全的Java代码。
### AVI文件结构详细说明 #### 一、AVI文件概览 AVI(Audio Video Interleaved)是一种由Microsoft公司开发的数字音频与视频文件格式,最初设计用于Microsoft Video for Windows (VFW)环境,并逐渐被多个操作系统...
这类文件通常被标记为隐藏文件,并且包含了用户的浏览历史记录、Cookies信息以及临时文件等内容。即使用户在浏览器中清除了这些数据,index.dat文件中的记录依然保留下来,这使得index.dat文件成为了计算机取证中的...
- 这部分主要包括了MFC中的一些辅助类,如`CString`字符串类、`CFile`文件类等,它们虽然不直接参与MFC类层次结构的核心部分,但在实际开发中同样非常重要。 #### 三、核心MFC类详解 1. **CObject类** - `...
### 社会保障卡文件结构和数据项(V2.0)关键知识点解析 #### 一、背景介绍 2012年5月末发布的《社会保障卡文件结构和数据项(V2.0)》是对原有社会保障卡标准的重要更新,旨在更好地满足社会保障卡在各个领域的应用...
5. **打开文件结构** (`HOFile`):记录打开文件的状态,包括文件的标志字、访问计数、指向FCB结构的指针、文件当前的读写指针等。 #### 五、实现细节 - **用户管理**:系统支持多用户同时登录,并能够识别超级用户...