Class文件结构介绍[魔数版本号]-阿里云开发者社区

开发者社区> 游客a74jvhcp7vclg> 正文

Class文件结构介绍[魔数版本号]

简介: 对于每个java程序员来说class文件应该是每天都会接触的,一个class文件都对应着唯一的一个类或接口的定义信息,但是对应class文件的具体存储结构并不一定很清楚
+关注继续查看


 对于每个java程序员来说class文件应该是每天都会接触的,一个class文件都对应着唯一的一个类或接口的定义信息,但是对应class文件的具体存储结构并不一定很清楚,所以本文就梳理下class文件的结构

Class文件

 Class文件是一组8位字节为基础单位的二进制流,各个数据项严格按照顺序紧凑的排列在Class文件中,中间没有添加任何分隔符,整个class文件中存储的内容几乎全部是程序运行的必要数据,没有空隙存在。

 Class文件格式采用一种类似于C语言结构体的伪结构来存储数据,这种结构体只有两种数据类型:无符号数和表

无符号数

 无符号数属于基本的数据类型,以u1,u2,u4,u8来分别表示1个字节,2个字节,4个字节和8个字节的无符号数,无符号数可以用来描述数字,索引引用,数量值或者按照UTF-8编码结构构成字符串值。

 表是由多个无符号数或者其他表作为数据项构成的复合数据类型,所有表都习惯性地一"_info"结尾,表用于描述有层次关系的复合结构的数据,整个class文件本质上就是一张表,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 aaccess_flags(访问标志) 1

u2 this_class(类索引) 1

u2 super_class(父类索引) 1

u2 interfaces_count(接口索引计数器) 1

u2 interfaces(接口索引集合) interfaces_count

u2 fields_count(当前类字段计数器) 1

field_info fields(字段表集合) fields_count

u2 methods_count(方法计数器) 1

method_info methods(方法表集合) methods_count

u2 attributes_count(属性计数器) 1

attribute_info attributes(属性表集合) attributes_count

 无论是无符号数还是表,当需要描述同一类型但数量不定的多个数据时,经常会使用一个前置的容器加若干个连续的数据项的形式,这时称这一系列连续的某一类型的数据为某一类型的集合。注意:class文件中存储的数据项都是被严格限定的,哪个字节代表什么含义,长度是多少,先后顺序如何,都不允许改变。

image.png

为了便于查看class的结构我们通过一个java文件编译出对应的class文件然后通过WinHex工具或者classpy来查看。

public class Test {

    private int a;
    
    public int  run(){
        System.out.println("波波烤鸭");
        return a=1;
    }
}

WinHex查看class文件:

image.png

classPy查看

image.png

部分内容说明

1.魔数

image.png

 每个Class文件的头4个字节成为魔数(Magic Number),它的唯一作用是确定这个文件是否为一个能被虚拟机接收的Class文件。所有Class文件,魔数均为0xCAFEBABE。

 注意:不仅仅是Class文件,还有很多文件(如:gif、jpeg等)都是以魔数(而不以后缀名)来进行身份识别的。

2.版本号

 紧接着魔数后的4个字节是版本号,第5和第6是次版本号,第7和第8是主版本号。本文中使用的jdk版本是8所以版本信息如下:

image.png

 Class文件能够被版本号对应jdk版本(或比对应版本高)的jdk加载,不能被比对应jdk版本低的jdk加载。jdk中的版本号是从45开始的,每个jdk的target参数(如果有的话)的参数值对应一个主版本号

image.png

参考《深入理解Java虚拟机》


版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
推荐一个WINDOWS系统文件介绍的网站
http://www.cn.filename.info/文件名信息数据库: 病毒, 特洛伊人, 背后?文件名义上 _*.* (5) a*.* (129) b*.* (38) c*.
701 0
ant build.xml文件中能使用的属性介绍
ant build.xml文件中能使用的属性介绍
15 0
Apache Flink 1.9.0版本新功能介绍
摘要:Apache Flink是一个面向分布式数据流处理和批量数据处理的开源计算平台,它能够基于同一个Flink运行时,提供支持流处理和批处理两种类型应用的功能。目前,Apache Flink 1.9.0版本已经正式发布,该版本有什么样的里程碑意义,又具有哪些重点改动和新功能呢?本文中,阿里巴巴高级技术专家伍翀就为大家带来了对于Apache Flink 1.9.0版本的介绍。
2478 0
【技术贴】解决Eclipse编译java源文件之后没有生成class文件|找不到class文件
【技术贴】解决Eclipse编译java源文件之后没有生成class文件|找不到class文件   今天遇到的,非常恶心,项目下有个红叉叉,因为是公司的老项目,1.4的jdk,我把工程导入后,发现没有报错,但是有小红叉,自动保存代码编译完java源文件之后,找不到class文件。
1410 0
JVM加载class文件的原理机制
Java 语言是一种具有动态性的解释型编程语言,当指定程序运行的时候, Java 虚拟机就将编译生成的 . class 文件按照需求和一定的规则加载进内存,并组织成为一个完整的 Java 应用程序。
754 0
VBA生成或读取指定字符集的文本文件
用VBA做工具的过程中,遇见这样一个问题。使用FSO方式或者直接OPEN文件方式,生成的文本文件采用的字符集为当前操作系统默认字符集,不能选择字符集类型。这样的文件作为应用程序的配置文件或者作为js代码文件,常常会因为字符集不是UTF-8,不能直接使用,需要利用记事本进行一次人工的字符集转换。
747 0
无法解析类型 javax.servlet.http.HttpServletRequest。从必需的 .class 文件间接引用
java.lang.Error: 无法解析的编译问题: 无法解析类型 javax.servlet.http.HttpServletRequest。从必需的 .class 文件间接引用了它 无法解析类型 javax.servlet.http.HttpServletResponse。
1540 0
+关注
游客a74jvhcp7vclg
10余年开发架构经验,同时乐于技术分享!
332
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载