程序员程序园程序员技术栈

详解 JVM 字节码(5)

2019-05-03  本文已影响10人  zidea
jvm

今天进入最关键也是最重要部分方法表,也是有一定难度。

定义方法访问标记
00 01 :表示一个 public 方法,这是一个构造方法。
00 0B : 对应常量池 # 11 <init>
00 0C : 对应常量池 #12 ()V
00 01 : 说明这个方法本身只有一个属性,每一个方法表都有 code 属性保存这个方法的结构
00 0D : #13 = Utf8 Code
00 00 00 43 (67): 字节长度


code 信息

00 02 :max_stack
00 01 : max_local
00 00 00 11: (17)code_length 表示该方法所包含字节码的字节数以及具体的指令码
我们可以根据 code_length 向后数 17 字节,这是函数 code 执行指令
2A B7 00 01 2A 12 02 B5 00 03 2A 10 0A B5 00 04 B1


code 信息

此图与上面字节码相对应。图中出现的为助记符,助记符和16进制对应

随后两个字节使用表示异常表信息的数量,如果为 0 表示没有异常信息表

00 00

表示异常表信息,异常表数量为 0 没有异常信息。

00 02

表示存在两个属性,随后

00 0E

这里的 00 0E(14) #14 = Utf8 LineNumberTable 对应常量池内容,LineNumberTable 用途是将字节码和实际代码行号进行对应便于调试查找问题

00 00 00 0E
00 03 00 00 00 03 00 04 00 04 00 0A 00 05

00 03 表示有三个对应关系

00 01 00 00 00 11 00 10 00 11 00 00
00 01 00 00 00 08

表示偏移量为 0 对应行号 8 ,行号 8 内容为return title;

00 01 00 00 00 05 00 10 00 11 00 00

表示有一个局部变量 this 。

2A 2B B5 00 03 B1
00 02 00 00 00 0C 00 05 00 0D

有两个对应关系

00 01 00 1A 00 00 00 02 00 1B

随后字节码可以按上面规则进行分析。

上一篇 下一篇

猜你喜欢

热点阅读