【笔记】深入理解java虚拟机--class 文件的正确打开方式。

首先,我们 简单的写个类

package com.dongdao;

public class PromjectStart {

private int m;

public int initm() {

return m +1;

}

}


执行    javac PromjectStart.java,生成  class 文件。

用 WinHex 打开该 class 文件,得到 如下。


【笔记】深入理解java虚拟机--class 文件的正确打开方式。_第1张图片

我们需要用到的对照表。

 表1 ,常量池类型

【笔记】深入理解java虚拟机--class 文件的正确打开方式。_第2张图片


表2 常量结构

【笔记】深入理解java虚拟机--class 文件的正确打开方式。_第3张图片


【笔记】深入理解java虚拟机--class 文件的正确打开方式。_第4张图片

 3, 执行 javap -verbose PromjectStart.class生成的类文件结构。


【笔记】深入理解java虚拟机--class 文件的正确打开方式。_第5张图片


分析,class结构如下。

【1】0-7 依次是 魔数 次版本 主版本。 8-9 是 常量池的大小,即 13 的 10进制 是19 ,一共有18的常量。对照 3 ,发现是 18个。

【2】继续,每一个常量都是以一个  u1 开始的,所以读 一位, 0A,然后查找表1,是Methodref,查表2,得到数据结构是,u1,u2,u2。所以,该位对应的索引是,ooo4 ,第四位索引,和 000f 第 15位索引。对着 3,发现一致。

【3】继续,读一个 u1,是 09,查表1 得到 Filerldref,查表2,数据结构是,u1,u2,u2。对应的索引是 0003 , 第3位索引, 和 第16 位索引。 对照 3 ,发现一致。


【4】 继续,读 一个  u1 是 07,查 表1 是classinfo,查 表2 是 u1,u2。对应的是18.

以此类比。。。

你可能感兴趣的:(【笔记】深入理解java虚拟机--class 文件的正确打开方式。)