在《Java虚拟机》一节中介绍了 Java 字节码,并说明了怎样将 java.class 文件反汇编为可读的字节码格式。本节将展示 Java 如何处理字符串,以及处理字符串的方法。
【示例】:寻址子串,下面的 Java 代码定义了一个字符串变量,其中包含了一个雇员 ID 和该雇员的姓氏。然后,调用 substring 方法将账号送入第二个字符串变量:
对该 Java 代码反汇编,其字节码显示如下:
ldc #32; //字符串 10034Smith
astore_0
aload_0
iconst_0
iconst_5
invokevirtual #34; // Method java/lang/String.substring
astore_1
现在分步研究这段代码,并加上自己的注释。ldc 指令把一个对字符串文本的引用从常量池加载到操作数栈。接着,astore_0 指令从运行时堆栈弹出该字符串引用,并把它保存到局部变量 empInfo 中,其在局部变量区域中的索引为 0:
接下来,aload_0 指令把对 empInfo 的引用压入操作数栈:
然后,在调用 substring 方法之前,它的两个参数(0 和 5)必须压入操作数栈。该操作由指令 iconst_0 和 iconst_5 完成:
invokevirtual 指令调用 substring 方法,它的引用 ID 号为 34:
substring 方法将参数弹出堆栈,创建新字符串,并将该字符串的引用压入操作数栈。其后的 astore_1 指令把这个字符串保存到局部变量区域内索引 1 的位置,也就是变量 id 所在的位置: