【Java】带你解读字节码(下)

第一时间阅读最新文章

29f1b772-8acb-4550-82ae-00fd2e237086.jpg

6.父类(super_class)

当前类的父类
表示指定在常量池的位置

0004

0x0004=4
#4

07 0015 

这个又指向#21
#21

01 0010 6a61 7661 2f6c 616e 672f 4f62 6a65 6374 
acsii码表查询结果:java/lang/Object

这里可以看出,这个类继承了Object类,所有类都继承这个类,所以我们没写,它也继承了。

7.接口(interfaces)

当前类实现的接口

接口数量(interfaces_count)

0000

我这里没有实现任何接口,当然接口数量为0啦。

接口列表(interfaces)

如果有接口的话,后面会接interfaces_count* 4位16进制数,每个u2对应这常量池中的位置

8.字段(fields)

字段是指当前类的属性,不是方法内部的属性

字段个数(fields_count)

0001

说明这个类有一个属性
然后我们读取后面的16位16进制数

字段列表(fields)

字段类型
表示字符 含义
B byte字节类型
J long长整型
C char字符类型
S short短整型
D double双精度浮点
Z boolean布尔型
F float单精度浮点
V void类型
I int整型
L 对象引用类型
字段
0002 0005 0006 0000 

第一个u2:字段的标记类型,标记类型,需要翻看前面的标记类型
第二个u2:字段的名称,对应这常量池中的位置
第三个u2:字段的类型,对应这常量池中的位置,需要翻看字段的类型
第四个u2:字段的属性,对应这常量池中的位置

0002说明这个字段为private类型
0005指向常量池#5
#5

0100 0161
acsii码表查询结果:a

0006指向常量池#6
#6

0100 0149 
acsii码表查询结果:I

I对应着int整型
0000指向#0,表示不作索引,也就是为null
如果在定义该属性时有赋值(int类型0是默认值),这个u2会指向一个不为null的常量

拼起来就是private int a;

9.方法(methods)

当前类的方法

方法个数(methods_count)

0002 

有两个方法,然而我们只定义了一个方法,那另外一个方法是哪里来的呢?
我们可以直接用idea打开编译好的.class文件,就可以看到,另外一个方法是构造方法

方法(methods)

我们先往后读6*4位16进制数

方法的描述
0001 0007 0008 0001

第一个u2:方法的标记类型,标记类型,需要翻看前面的标记类型
第二个u2:方法的名称,对应这常量池中的位置
第三个u2:方法的类型,对应这常量池中的位置,需要翻看字段的类型
第四个u2:方法的属性个数

翻译过来就是 public <init>()V
有一个属性

方法的属性

我们需要往后读3*4位16进制数,这几位数说明了该方法的属性情况

0009 0000 0038

第一个u2:属性的名称,对应这常量池中的位置
第二个u4:属性描述的长度,表示后面的u2个数,都是对属性的描述
第一个u2指向#9
#9

01 0004 436f 6465 
acsii码表查询结果:Code

这个Code是JVM虚拟机已经预定义好的属性,相当于方法内部的代码,详情去百度搜一下“JVM虚拟机规范预定义的属性”,这里我就不展开讲述了

第二个u2:0x38=56
那我们再往后读56*2位16进制数

0002 0001 0000 000a 2ab7 0001 2a03 
b500 02b1 0000 0002 000a 0000 000a 
0002 0000 0003 0004 0004 000b 0000 
000c 0001 0000 000a 000c 000d 0000

Code的属性结构
第一个u2:属性的最大堆数
第二个u2:属性的最大本地内存
第三个u4:指令描述的长度,表示后面的u2个数
第四个nu2:指令,需要参照JVM 虚拟机字节码指令表
第五个u2:
异常处理*
第六个u2:属性的属性个数
·······后面就是属性的描述
属性的解读跟前面的属性解读一样,但是需要注意的是,这些属性一般都是JVM虚拟机已经预定义好的属性,所以要按照相应的属性结构进行解读。

这里我就不解读了,

10.类属性

这个就是当前类的属性了

最后的几位16进制数就是对类属性的描述了

属性的个数

00 01

表示有一个属性

属性的描述

00 1000 0000 0200 11

第一个u2:属性常量的索引,对应这常量池中的位置
第二个u4:属性描述的长度,表示后面的u2个数
n*u2:对应这常量池中的位置

五、总结

.class文件的结构

魔数
cafe babe 
版本号
0000 0034 
常量池
0016 
0a00 0400 12
09 0003 0013 
0700 14
07 0015 
0100 0161
0100 0149 
0100 063c 696e 6974 3e
01 0003 2829 56
01 0004 436f 6465 
0100 0f4c 696e 654e 756d 6265 7254 6162 6c65 
0100 124c 6f63 616c 5661 7269 6162 6c65 5461 626c 65
01 0004 7468 6973 
0100 134c 7465 7374 2f42 7974 6543 6f64 6554 6573 743b 
0100 0367 6574 
0100 0328 2949 
0100 0a53 6f75 7263 6546 696c 65
01 0011 4279 7465 436f 6465 5465 7374 2e6a 6176 61
0c 0007 0008 
0c00 0500 06
01 0011 7465 7374 2f42 7974 6543 6f64 6554 6573 74
01 0010 6a61 7661 2f6c616e 672f 4f62 6a65 6374 
当前类的访问标记
0021 
当前类
0003 
父类
0004
实现接口数
0000 
字段
0001 
0002 0005 0006 0000 
方法
方法个数
0002 
方法描述
0001 0007 0008 0001 
方法属性描述
0009 0000 0038 
0002 0001 0000 000a 2ab7 0001 2a03 
b500 02b1 0000 0002 000a 0000 000a 
0002 0000 0003 0004 0004 000b 0000 
000c 0001 0000 000a 000c 000d 0000 

0001 000e 000f 0001 
0009 0000 002f 
0001 0001 0000 0005 2ab4 0002 ac00
0000 0200 0a00 0000 0600 0100 0000 
0600 0b00 0000 0c00 0100 0000 0500 
0c00 0d00 00
类属性
00 0100 1000 0000 0200 11

启示

通过这次字节码的学习,我了解到了字节码的组成,java源代码是怎么编译成.class文件的。
但是这个可真难啊,什么都是规定死了的,只要对着结构表就可以解读了。

——————————————————————————————
如果本文章内容有问题,请直接评论或者私信我。
未经允许,不得转载!

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

推荐阅读更多精彩内容