美文网首页程序员技术干货
JVM系列:(五).class文件结构

JVM系列:(五).class文件结构

作者: 8b6370ea271c | 来源:发表于2019-01-24 21:30 被阅读3次

原文链接:JVM系列:(五).class文件结构


各种不同平台的虚拟机与所有平台都统一使用的程序存储格式---字节码(ByteCode)是构成平台无关性的基石。

一 .class文件的来源

计算机只认识0和1,所以我们写的程序需要被编译器翻译成由0和1构成的二进制格式才能被计算机执行。

JVM只认识.class字节码,所以想要在JVM上运行的所有语言都需要编译为JVM能识别的字节码格式。

二 具体结构

2.1 结构

整个 class 文件的结构基本保持了我们编写 java 源码程序的上下结构,其本质上就是一张表,如果所示:

名称 数量 描述
magic 1 魔数
minor_version 1 次版本号
major_version 1 主版本号
constant_pool_count 1 常量池中常量的个数
constant_pool constant_pool_count-1 常量池
access_flags 1 访问标志
this_class 1 类索引
super_class 1 父类索引
interfaces_count 1 接口索引集合容量大小
interfaces interfaces_count 接口索引集合
fields_count 1 字段表集合容量大小
fields fields_count 字段表集合
methods_count 1 方法表集合容量大小
methods methods_count 方法表集合
attributes_count 1 属性表集合容量大小
attributes attributes_count 属性表集合

2.2 描述

  • 魔数:它的唯一作用是用于确定这个文件是否为一个能被虚拟机接受的class文件。使用魔数而不是扩展名来进行识别主要是基于安全考虑,因为文件扩展名可以很随意的被改动。
  • 次版本号:class 文件的版本号。
  • 主版本号:class 文件的版本号,每个JDK大版本的发布,主版本号都会向上加1,高版本的JDK能向下兼容以前版本的class文件,但不能运行以后版本的class文件。
  • 常量池中常量的个数:由于常量池中常量的数量是不固定的,所以在常量池的入口需要设置一个数据表面常量池容量大小。
  • 常量池:常量池主要存放两大类常量,字面量和符合引用。字面量比较接近于Java语言层面的常量概念,如文本字符串、被声明为final的常量值等。而符号引用则包含三类常量(1:类和接口的全限定名、2:字段的名称和描述符、3:方法的名称和描述符)。
  • 访问标志:这个标志用于识别一些类或接口的访问信息,包括:这个class是类还是接口;是否定义为public类型;是否定义为abstract类型;如果是类的话,是否被声明为final等等。
  • 类索引:用于确定这个类的全限定名。
  • 父类索引:用于确定这个类的父类的全限定名。由于Java语言不容许多重继承,所以父类索引只有一个,除了 java.lang.Object 外,所有的Java类都有父类,因此除了 java.lang.Object 外,所有Java类的父类索引都不为0.
  • 接口索引集合容量大小:用于表示接口索引集合的容量大小。
  • 接口索引集合:用来描述这个类实现了哪些接口,这些被实现的接口将按 implements 语句(如果这个类是一个接口,则应当是 extends 语句)后的接口顺序从左到右排列在接口的索引集合中。
  • 字段表集合容量大小:用于表示字段表集合的容量大小
  • 字段表集合:用于描述接口或类中声名的变量,包括了类级变量或实例级变量,但不包括在方法内部声明的变量。包括以下信息:字段的作用域(public、private、protected修饰符)、是类级变量还是实例级变量(static修饰符)、可变性(final)、并发可见性(volatile修饰符,是否强制从主内存读写)、字段名称等。
  • 方法表集合容量大小:用于表示方法表集合的容量大小
  • 方法表集合:用于表示类或接口中定义的方法。和字段表集合类似。
  • 属性表集合容量大小:用于表示属性表集合的容量大小
  • 属性表集合:在class文件、字段表、方法表中都可以携带自己的属性表集合,以用于描述某些场景专有的信息。

三 总结

class文件是Java虚拟机执行引擎的数据入口,也是Java技术体系的基础支柱之一。了解class文件的结构对后面进一步了解虚拟机执行引擎有很重要的意义。


接下来我们将介绍:

  • JVM类加载步骤

扫码关注有惊喜

相关文章

  • JVM系列:(五).class文件结构

    原文链接:JVM系列:(五).class文件结构 各种不同平台的虚拟机与所有平台都统一使用的程序存储格式---字节...

  • [JVM系列]Class文件结构

    Class文件结构

  • ASM 库的介绍和使用

    前面几篇文章介绍了 .class 文件的结构、JVM 如何加载 .class 文件、JVM 中如何执行方法的调用和...

  • JVM系列:(六)JVM类加载步骤

    原文链接:JVM系列:(六)JVM类加载步骤 一 什么是类加载 上一章我们了解了class文件存储结构,在clas...

  • 访问者模式和 ASM

    之前三篇文章介绍了 .class 文件的结构、JVM 对 .class 文件加载以及在 JVM 中是怎么执行程序的...

  • JVM内存结构与GC

    JVM体系结构 类装载器ClassLoader 负责加载class文件,class文件在文件开头有特定的文件标示,...

  • JVM Class文件结构

    在class文件中,有两种数据类型:无符号数和表,其他的都是数据了无符号数:以u1、u2、u4、u8来分别代表1个...

  • JVM class 文件结构

    class 文件的结构如下: Constant Pool 每个Constant Pool Entry由cp_inf...

  • 小白懂JVM系列-class文件结构

    class文件架构-官方图 分条解析class文件结构 u4 magic:class文件的魔数u2 minor_v...

  • JVM学习笔记一

    JVM运行机制 JVM的启动过程 JVM的基本结构 JVM通过ClassLoader将class文件加载到内存中 ...

网友评论

    本文标题:JVM系列:(五).class文件结构

    本文链接:https://www.haomeiwen.com/subject/jpzujqtx.html