我在玩 javap 和一些非常简单的代码,这引发了一个 - 希望是简单的 - 问题。
这里首先是代码:
public class Main {
public static void main(String[] args) throws Exception {
System.out.println(m1());
System.out.println(m2());
}
private static String m1() {
return new String("foobar");
}
private static String m2() {
String str = "foobar";
return new String(str);
}
}
现在我编译了代码并查看了输出(暂时省略 -verbose)。
$ javap -c Main.class
Compiled from "Main.java"
public class Main {
public Main();
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: return
public static void main(java.lang.String[]) throws java.lang.Exception;
Code:
0: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream;
3: invokestatic #3 // Method m1:()Ljava/lang/String;
6: invokevirtual #4 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
9: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream;
12: invokestatic #5 // Method m2:()Ljava/lang/String;
15: invokevirtual #4 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
18: return
}
现在这一切都说得通了,我理解了不同的字节码,但我想到的问题是:
- 我看到在 invokestatic 调用中提到了“m1”和“m2”,所以它们以某种方式被调用,但我在 javap 调用中没有看到它们的实际字节码输出!
- 现在,他们是内联还是不显示?如果是这样,为什么?
同样,这个问题只是对 javac 如何在内部处理这些东西感兴趣。谢谢!