美文网首页
【笔记】深入理解 java 虚拟机---Class的文件结构。

【笔记】深入理解 java 虚拟机---Class的文件结构。

作者: 张航_8ee7 | 来源:发表于2018-01-02 16:22 被阅读0次

    Class 文件是一组以8位字节为基础单位的二进制流。

    类似下图,0-3是一组。4-7是一组。

    Class 文件是类似与c语言结构的伪结构来存储数据的。由两种数据类型组成:

    【1】 无符号数。 基本数据类型。以u1,u2,u4,u8。来代表1个字节、2个字节、4个字节、8个字节的无符号数。无符号数可以用来表示,数字,索引引用,数量值,字符串值。

    【2】表。以多个无符号数或者表组成的复合型数据结构。已_info结尾。class 文件本质就是一张表。

    1  魔数 与class 版本。

    魔数就是文件开头的4个字节,如上面的 cafebabe,来确定文件格式。

    https://www.cnblogs.com/mq0036/p/3912355.html

    摘要几个。

    JPEG (jpg),文件头:FFD8FF 

    PNG (png),文件头:89504E47 

    GIF (gif),文件头:47494638 

    TIFF (tif),文件头:49492A00 

    Windows Bitmap (bmp),文件头

    接着的  00 00 00 34 ,分别代表,次版本号(00 00)和主板本号(00 34)。

    2 常量池

    版本过后紧接着 就是常量池。先由一个u2 类型的数据,保存该类的常量池大小。 如上8-9(00 1d),换成 10进制是 29。 也就是 有28个常量, 索引 范围是 1-28。

    常量池 放的是  字面量和 符号引用。

    字面量 : 字符串,修饰为final的常量。

    符号引用:类和接口的全限定名。  字段名称和描述符。 方法名称和描述符。

    常量池中为什么要包含这些内容?

    class文件不会保各个方法 字段的最终内存布局信息,因为这些方法,字段,不经过运行期转换无法得到真正的内存信息。

    虚拟机在运行时,会从常量池获得对应的符号引用,再在类创建时或运行时解析,翻译到具体的内存入口。

    常量池的一共有 14 种常量。如下:

    其中 1-8 是 字面量。  9-18 是 符号引用。

    上述的14种常量,每一种都有自己的数据结构。

    下面 有一片博客专门介绍 如何分析 : 生成 的 class 文件。

    https://www.jianshu.com/p/4224b896516e

    3 访问标志

    根据上面的表格,测试类的访问标志为ACC_PUBLIC | ACC_SUPER = 0x0001 | 0x0020 =1 | 32 = [00000000][00000001] | [00000000][00010000] = [00000000][00010001] = 33 = 0x0021 。

    是 普通类,不是接口、枚举或注解、被public 声明但没有声明  final 和 abstract ,并且使用了 1.2 jdk 作编辑器。

    类索引,接口索引集合,父类索引。

    0003 是 类索引  ,0004 是 父类 索引,0001 是接口集合大小,后面的 0005 是实现的接口。占一个 u2。从左到右。

    相关文章

      网友评论

          本文标题:【笔记】深入理解 java 虚拟机---Class的文件结构。

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