通过用JAVAP反汇编来帮你领略Java特性
副标题#e#
本文通过先容用Javap反汇编帮你领略Java特性,利用 Javap 深入查察类文件。
Java 开拓人员熟悉在一个轮回中利用StringBuffer 来取代串联 String 工具能得到最佳机能。然而,大都开拓人员从来没有较量两种要领发生的字节代码的区别。在 Java 开拓东西包(JDK)中有一个叫做 javap 的东西可以汇报你为什么这样做可以得到最佳机能。
Javap 将一个类和它的要领的一些转储信息输出到尺度输出。该东西不把代码反编译为 java 源代码,可是它会把字节代码反汇编成为由 Java 虚拟机类型界说的字节代码指令。
在你需要查察编译器为你可能给你做了什么的时候,可能你想要看一处代码的窜改对编译后的类文件有什么影响的时候,javap 相当有用。
此刻以我们前面提到的 StringBuffer 和 String 作为一个例子。下面是一个专门为例子设计的类,它有两个要领,都返回一个由0到 n 的数字构成的 String,个中 n 由挪用者提供。两个要领独一的区别在于一个利用 String 构立功效,别的一个利用 StringBuffer 构立功效。
public class JavapTip {
public static void main(String []args) {
}
private static String withStrings(int count) {
String s = "";
for (int i = 0; i < count; i++) {
s += i;
}
return s;
}
private static String withStringBuffer(int count) {
StringBuffer sb = new StringBuffer();
for (int i = 0; i < count; i++) {
sb.append(i);
}
return sb.toString();
}
}
此刻让我们看看对这个类利用–c 选项运行 javap 的输出。-c 选项汇报 javap 反汇编在类中碰着的字节代码。
运行方法如下:
>javap -c JavapTip
此呼吁的输出为:
Method java.lang.String withStrings(int)
0 ldc #2
2 astore_1
3 iconst_0
4 istore_2
5 goto 30
8 new #3
11 dup
12 invokespecial #4
15 aload_1
16 invokevirtual #5
19 iload_2
20 invokevirtual #6
23 invokevirtual #7
26 astore_1
27 iinc 2 1
30 iload_2
31 iload_0
32 if_icmplt 8
35 aload_1
36 areturn
#p#副标题#e#
Method java.lang.String withStringBuffer(int)
0 new #3
3 dup
4 invokespecial #4
7 astore_1
8 iconst_0
9 istore_2
10 goto 22
13 aload_1
14 iload_2
15 invokevirtual #6
18 pop
19 iinc 2 1
22 iload_2
23 iload_0
24 if_icmplt 13
27 aload_1
28 invokevirtual #7
31 areturn
假如你以前没有看过 Java 汇编器,那么这个输出对你来说就会较量难解,可是你应该可以看到 withString 要领在每次轮回的时候都新建设了一个 StringBuffer 实例。然后它将已有的 String 的当前值追加到 StringBuffer 上,然后追加轮回的当前值。最后,它对 buffer 挪用 toString 并将功效赋给现有的 String 引用。
withStringBuffer 要领与这个要领正好相反,在每次轮回的时候 withStringBuffer 只挪用现有 StringBuffer 的 append 要领,没有建设新的工具,也没有新的 String 引用。
在这种环境下,我们已经知道了利用 StringBuffer 取代 String 是一种好的做法,可是假如我们不知道呢?那么 javap 可以辅佐我们找到谜底。在这里你可以看到更具体的关于String,StringBuffer 的表明
你并不会常常需要一个 Java 反汇编器,可是当你需要的时候,知道你本身的呆板已经有一个而且用法相当简朴的反汇编器虽然是一件功德。假如你感乐趣,看书看看 javap 的其它选项——或者你会发此刻你的情况中需要的特性。