Java class 文件
1、Class文件是什么:class文件是java程序二进制文件的精确的定义,每一个class的文件都对应一个类或则接口,class文件是JVM真正能读懂的文件格式。
2、Class文件与java的关系:一般的讲class文件由java的类文件编译而来,但是事实上class文件只是定义的一种格式,你甚至可以手动编写二进制文件,只要能满足class文件的定义,就可以由JVM解析,执行。
3、Class 文件概况:1、是由8位字节的二进制流,2、高位在前的形式;3、数据项之间没有间隔,保持文件的紧凑。
4、Class 的文件数据类型:
4.1、 class 文件的基础数据类型
U1 |
1个字节,无符号类型 |
U2 |
2个字节,无符号类型 |
U4 |
4个字节,无符号类型 |
U8 |
8个字节,无符号类型 |
4.2、复合数据类型:复合数据类型是有一个或者多个具有具体定义的基础数据类型或者复合数据类的组成的结构体;可以将复合数据类型分为4类:
4.2.1、 cp_info 类型:cp_info是定义常量池的数据格式,一共有11种具体的格式;通用格式如下:
类型 |
名称 |
数量 |
U1 |
Tag |
1 |
U1 |
info |
根据tag的值决定 |
(1)、 constant_utf8_info:存储四种基本信息类型,文字字符串,定义的类或者借口的描述,其他类或者接口的符号引用以及属性相关的字符串,具体的格式如下:
类型 |
名称 |
数量 |
说明 |
U1 |
tag |
1 |
标志值为1;0x 01 |
U2 |
Length |
1 |
后续bytes项的长度 |
U? |
bytes |
length |
变体UTF8格式的数据 |
(2)、 constant_integer_info:int类型的值
类型 |
名称 |
数量 |
说明 |
U1 |
tag |
1 |
标志值为3;0x 03 |
U4 |
bytes |
1 |
高位在前格式的int值 |
(3)、 constant_float_info:float类型的值
类型 |
名称 |
数量 |
说明 |
U1 |
tag |
1 |
标志值为4;0x 04 |
U4 |
bytes |
1 |
高位在前的float值 |
(4)、 constant_long_info:long类型的值
类型 |
名称 |
数量 |
说明 |
U1 |
tag |
1 |
标志值为5;0x 05 |
U8 |
bytes |
1 |
高位在前的long值 |
(5)、 constant_double_info:double的值
类型 |
名称 |
数量 |
说明 |
U1 |
tag |
1 |
标志值为6;0x 06 |
U8 |
bytes |
1 |
高位在前的long值 |
(6)、 constant_class_Info:使用符号引用表示类或者接口。
类型 |
名称 |
数量 |
说明 |
U1 |
tag |
1 |
标志值为7;0x 07 |
U2 |
Name_index |
1 |
包含类或者接口的全限定名的constant_utf8_info的索引 |
(7)、 constant_string_info:文字字符串者java.lang.string的实例
类型 |
名称 |
数量 |
说明 |
U1 |
tag |
1 |
标志值为8;0x 08 |
U2 |
String_index |
1 |
包含文字字符串值的constant_utf8_info的索引 |
(8)、 constant_fieldref_info:指向字段的符号引用;
类型 |
名称 |
数量 |
说明 |
U1 |
tag |
1 |
标志值为9;0x 09 |
U2 |
Class_indx |
1 |
被引用字段的类或者接口constant_utf8_info的索引 |
U2 |
Name_and_type_index |
1 |
提供constant_nameandtype_info的索引 |
(9)、 constant_method_info:方法的符号引用
类型 |
名称 |
数量 |
说明 |
U1 |
tag |
1 |
标志值为10;0x 0A |
U2 |
Class_indx |
1 |
被引用字段的类或者接口constant_utf8_info的索引 |
U2 |
Name_and_type_index |
1 |
提供constant_nameandtype_info的索引 |
(10)、 constant_interfaceMethodref_info:接口中申明的方法的符号引用
类型 |
名称 |
数量 |
说明 |
U1 |
tag |
1 |
标志值为11;0x 0B |
U2 |
Class_indx |
1 |
被引用字段的类或者接口constant_utf8_info的索引 |
U2 |
Name_and_type_index |
1 |
提供constant_nameandtype_info的索引 |
(11)、 constant_nameandtype_info:提供引用字段或者方法的简单名称和描述符的常量池入口
类型 |
名称 |
数量 |
说明 |
U1 |
tag |
1 |
标志值为12;0x 0C |
U2 |
name_indx |
1 |
被引用字段的类或者接口constant_utf8_info的索引 |
U2 |
Descriptor_index |
1 |
被引用字段的类或者接口constant_utf8_info的索引 |
4.2.2、 field_info:定义在类或者接口中声明的每一个字段;具体格式:
类型 |
名称 |
数量 |
说明 |
U2 |
Access_flags |
1 |
申明字段的修饰符 |
U2 |
name_indx |
1 |
简单名称的constant_utf8_info的索引 |
U2 |
descriptor_index |
1 |
字段描述符的constant_utf8_info的索引 |
U2 |
Attributes_count |
|
Attribute_info的数量 |
Attribute_info |
attributes |
Attributes_count |
Attribute_info的列表 |
4.2.3、 method_info:定义在类或者接口中声明的方法
类型 |
名称 |
数量 |
说明 |
U2 |
Access_flags |
1 |
修饰符 |
U2 |
name_indx |
1 |
方法简单名称的constant_utf8_info的索引 |
U2 |
descriptor_index |
1 |
方法描述符的constant_utf8_info的索引 |
U2 |
Attributes_count |
|
Attribute_info的数量 |
Attribute_info |
attributes |
Attributes_count |
Attribute_info 的列表 |
4.2.4、 attribute_info:jvm 规范一共定义了9中属性
类型 |
名称 |
数量 |
说明 |
U2 |
Attribute_name_index |
1 |
属性名称的constant_utf8_info的索引 |
U4 |
Attribute _length |
1 |
属性数据的长度,不包含开始的6个字节 |
U1 |
info |
1 |
数据 |
5、特殊字符串:常量池中包含有三种特殊的字符串:全限定名,简单名称和描述符;
所有的符号引用都包括类或者接口的全限定名,字段的符号引用除了全限定名之外,还有简单字段,和字段的描述符;方法的符号引用除了全限定名之外,还有简单方法和描述符;
- 全限定名:常量池入口指向类或者接口的时候,给出类或者接口的全限定名,如:java/lang/object .由/替换
- 简单名称:字段名或者方法名以简单名称出现在常量池,如:java.lang.system的java.io.printstream out 在常量池中为out
- 描述符:字段的描述符给出字段的类型,方法的描述符,给出方面的返回值和方法的参数的数量、类型和顺序
6、class 文件的内容格式: 按照先后顺序依次为下表的结构!
类型 |
名称 |
数量 |
说明 |
U4 |
magic |
1 |
魔数 |
U2 |
Minor_version |
1 |
次版本号 |
U2 |
Major_version |
1 |
主版本号 |
U2 |
Constant_pool_count |
1 |
常量池的数量 |
Cp_info |
Constant_pool |
Constant_pool_count-1 |
常量池 |
U2 |
Access_flags |
1 |
类的访问标志信息 |
U2 |
This_class |
1 |
指向当前类的常量索引 |
U2 |
Super_class |
1 |
指向父类的常量的索引 |
U2 |
Interfaces_count |
1 |
接口的数量 |
U2 |
Interfaces |
Interfaces_count |
Interface的常量索引 |
U2 |
Fields_count |
1 |
字段数量 |
Field_info |
fields |
Fields_count |
字段的信息 |
U2 |
Methods_count |
1 |
方法的数量 |
Method_info |
methods |
Methods_count |
方法的信息 |
U2 |
Attributes_count |
1 |
属性的数量 |
Attributes_info |
attributes |
Attributes_count |
属性的信息 |
本站支持 pay for your wishes
相关推荐
### Class文件格式详解 #### 一、概述 在Java编程语言中,编译后的源代码会生成`.class`文件,这种文件格式对于Java程序的执行至关重要。本文将深入探讨Class文件格式的基本结构、组成部分以及其如何支持Java...
《深入剖析Java Class文件格式》 Java程序在编译后会生成后缀为`.class`的文件,这些文件包含了运行时所需的所有信息。本实验旨在通过详细分析一个名为`Test.class`的文件,揭示其内部结构,从而理解Java类文件的...
在深入讲解Class文件格式之前,我们需要理解Java字节码的概念,它是一种平台无关的中间语言,使得Java程序可以在任何支持JVM的设备上运行。 1. **总体格式** Class文件的结构遵循一个固定的模板,由多个字段组成...
Java class文件格式是Java虚拟机(JVM)执行的基础,它包含了构成Java程序的基本元素。在本文中,我们将深入探讨class文件中的数据类型,特别是CONSTANT_Class_info和CONSTANT_Fieldref_info这两个重要的数据项。 ...
Java Class文件是Java虚拟机(JVM)执行的二进制格式,它是程序的核心组成部分,包含了编译后的字节码指令。这篇学习笔记主要探讨了Class文件的结构、...理解Class文件格式对于深入理解Java虚拟机的工作原理至关重要。
java class文件格式详解,pdf格式,6M
java虚拟机中,Class文件格式的详细分解图例,建议收藏保存
以思维导图的方式概括了java class文件的结构。其中用位置描述了各个结构出现的顺序。为JVM的一个分支。
Class文件的格式是严格定义的,确保了JVM能够正确解析和执行其中的代码。在JVM规范第四章中,详细描述了Class文件的结构,主要包括以下几个关键部分: 1. **魔数(Magic Number)**:每个Class文件的开头都有一个4...
Java Class文件是Java程序编译后的二进制表示形式,它是Java虚拟机(JVM)运行的基础。本文将详细解析Class文件中的方法部分,帮助读者理解其结构和功能。 首先,Class文件由多个结构化的数据单元组成,其中包括`...
而"class文件查看器"则提供了一个友好的界面,让开发者无需深入了解class文件格式的细节,就能查看并理解这些内部结构。它支持查看类的元数据,包括类名、父类、接口、方法签名、常量池等。此外,它还允许用户深入到...
每个部分紧密相连,不存在任何无意义的填充字节,这使得Class文件格式既紧凑又高效。 #### 二、Class文件主要内容解析 1. **Magic Number (魔数)** - 魔数是Class文件的前四个字节,值为`0xCAFEBABE`。它的主要...
在探讨Java class文件格式时,数据类型的处理是其中非常核心和基础的部分。Java class文件格式由Oracle官方定义,是Java虚拟机(JVM)执行Java程序时所依赖的文件格式。数据类型在class文件格式中扮演着非常重要的...
Java class文件格式是Java虚拟机(JVM)能够识别和执行的基本单元,它是Java源代码编译后的结果。深入理解class文件格式对于开发者而言至关重要,因为它不仅有助于理解JVM的工作原理,还能帮助我们深入理解Java语言...
Java Class文件格式是Java虚拟机(JVM)能够识别和执行的基础。它是Java源代码经过编译后的二进制表示,包含了程序的结构、方法、字段等信息,使得JVM可以解析并执行其中的指令。深入理解Class文件格式对于开发者来...
魔术数是class文件的开头四个字节,值为0xCAFEBABE,这是JVM用来识别class文件格式的一种机制。紧随魔术数之后,是两个字节的版本信息,分别表示主版本号和次版本号,主版本号表示class文件可以被执行的JVM版本,次...
在深入Class文件格式之前,我们需要理解三个关键概念: 1. 数据类型:在Class文件中,数据以特定的无符号类型表示,包括u1(1字节)、u2(2字节)和u4(4字节)。这些基本类型构成了Class文件数据的基础。 2. 表...
Java class文件格式之常量池 Java class文件格式之常量池是Java虚拟机(JVM)加载和执行Java类文件的核心组件之一。常量池是class文件的一部分,存储着Java类文件中的各种常量信息,如字符串常量、类名、方法名、...
Java class文件格式是Java虚拟机(JVM)运行的基础,其中访问标志信息(access_flags)是定义类或接口访问权限及特性的关键部分。访问标志信息位于class文件的结构中,紧随常量池之后,占据2个字节的空间。 访问...