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
相关推荐
这篇文档是摘自深入理解Java虚拟机的第六章内容,为了更好的学习,特意整理一份电子版,方便学习。
自己结合class文件格式做的一个小实验,尽管小能直观的展示class文件内部的构造,这个文档对class文件中的每个字节都多了分析
java class文件格式详解,pdf格式,6M
java虚拟机中,Class文件格式的详细分解图例,建议收藏保存
Javaclass文件格式之访问标志信息——动力节点共6页.pdf.zip
以思维导图的方式概括了java class文件的结构。其中用位置描述了各个结构出现的顺序。为JVM的一个分支。
Class文件格说明。。。
在JVM虚拟机规范第四章中规定了class文件必须是一个固定的结构,如下所示:在JVM规范中 u1 、 u2 、 u4 分别表示的是1、2、4个字节的无符号数,
2.2 major_version.minor_versionmajor_version.minor_version合在一起形成当前.class文件的版本号,
NULL 博文链接:https://plkong.iteye.com/blog/1680902
* 主要用于存储以下内容: * 1、字面量,包括文本字符串、被申明为final类型的常量等 * 2、符号引用:类或是接口的全限定名称、方法以及字段的名称及描述符
主要介绍了Java class文件格式之数据类型的相关资料,需要的朋友可以参考下
解码class文件格式
轻松方便的把class文件转化为java文件
2、可处理多个*.class文件,可以处理文件夹内的所有文件,甚至可以处理*.jar文件; 3、带有多页面文本编辑器,也可集成在资源管理器中,随时点击右键都可进行操作; 4、支持java语法的高亮显示; 使用说明: ======...
class文件打开工具不需要安装,直接将class文件拖拽到窗口即可
class文件解析器class文件解析器class文件解析器
主要介绍了Java class文件格式之属性详解,需要的朋友可以参考下
主要介绍了Java class文件格式总结的相关资料,非常不错,具有参考借鉴价值,需要的的朋友参考下吧
class文件查看器,可以查看class文件,转译出代码.方便大家使用.(java工具类)简单的工具没这么多说明,说这些只是为了凑字数啦啦啦啦