读懂 Java 字节码(2)

java-logo.jpg

要查看 class 的字节码有很多方式,这里我选择自己比较喜欢 vscode 提供插件来查看,下载下图的插件安装后就可以在 vscode 中查看字节码文件。

hexdump.JPG

表示 coffee baby 这是模数,也是校验这个文件是 JVM 认可的字节码文件。如果要是我开发的就修改为 ZI EA 呵呵


byte_code.JPG

魔数

CA FE BA BE

前u4 前四个字节是魔数,表示 coffee baby 这是模数,也是校验这个文件是 JVM 认可的字节码文件。如果要是我开发的就修改为 ZI EA 呵呵

版本信息

00 00 00 34

  • 00 00 前两位代表小版本号
  • 00 34 表示 52 是 java 版本号 52 对应 java 1.8
java version "1.8.0_171"
Java(TM) SE Runtime Environment (build 1.8.0_171-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.171-b11, mixed mode)

常量池数量

00 18

24(1 * 16 + 8 = 24) 代表有 23 个常量,为什么是 23 常量而不是 24 常量,因为 0 作为 JVM 保留常量,常量是从 1 开始的,所以需要减去 1 为 24

0A

常量池是以数据表的结构来保存常量信息,这里表是按既定的顺序来组织一类数据。每一个常量根据类型不同而有不同的长度。那么也就是说常量池的长度是可变的。JVM 如何知道读取到哪一位置就结束了常量池呢。首先根据 18(24)进行一条一条地读取常量,每一个常量根据类型可以计算出其长度。这样 JVM 就很容易就可以计算出常量池结束位置。

在开始之前先介绍一下在字节码有关基本类型和引用类型表示,在字节码文件中要尽可能节省空间,所以使用大写字母来表示类型,而且字节码是给机器阅读的。
基本类型 I(int)

constant_table.png

这里列出 12 中基本常量,在 JDK 1.7 之后又新增了三种常量,这里不作为重点所以没有罗列出。我们先看一下表,根据结构,常量名称 CONSTANT_utf8_info ,tag 表示常量类型占一个字节,这里的 U1 表示一个字节,然后是长度为 U2 两个字节,先不说了我们通过表来在字节码中读取几个常量就能明白了。

我们使用以上表对应去查找就可以读懂常量池的字节码代表含义了。
接着表示常量数量字节码向下读取

0A 

表示 11 对应表中的 CONSTANT_InterfaceMethodref_info 好,找到类型我们继续向下看,第一个两个字节表示引用指向该字段或名称常量项的索引,继续向下两个字节为

00 04

我们可以现在 javap 编译后可读性较高的文件看一下 4 是什么东西

 #4 = Class              #23            // java/lang/Object

04 表示指向 4 ,其实就是定义构造函数的 <init>
接下来是两个字节是

00 14

14 转为 20 (16 + 4)这里指向一个 20 的在可读 class 文件中内容为两个引用 7 和 8 ,让后将 7 和 8 内容获取进行简单拼接就是 <init>()V

 #7 = Utf8               <init>
#8 = Utf8               ()V
 #9 = Utf8               Code
 #20 = NameAndType        #7:#8          // "<init>":()V

使用 javap 命令将字节码文件呈现可读文件中对应下面字节码

0A 00 04 00 14

的文本为

#1 = Methodref          #4.#20         // java/lang/Object."<init>":()V

1 代表第一行,0A 代表 Methodref 常量的类型,#4 #20 表示两个引用,通过获取两个引用组成字符串为 java/lang/Object."<init>":()V。


java_bean.jpg
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,189评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,577评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,857评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,703评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,705评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,620评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,995评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,656评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,898评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,639评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,720评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,395评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,982评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,953评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,195评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,907评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,472评论 2 342

推荐阅读更多精彩内容