gpt4 book ai didi

jvm - javac 也内联吗?

转载 作者:行者123 更新时间:2023-12-04 14:42:41 24 4
gpt4 key购买 nike

我正在研究 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 如何在内部处理这些东西的兴趣。谢谢!

最佳答案

它们在那里,但您使用的默认标志不会显示它们,因为它们是私有(private)方法。为了同时查看 m1 和 m2 的定义,请使用

javap -p -c .\Main.class

这将显示所有内部成员,包括私有(private)成员和公共(public)成员。如果您使用上面的命令,这就是您将得到的。

PS C:\Users\jbuddha> javap -p -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

private static java.lang.String m1();
Code:
0: new #6 // class java/lang/String
3: dup
4: ldc #7 // String foobar
6: invokespecial #8 // Method java/lang/String."<init>":(Ljava/lang/String;)V
9: areturn

private static java.lang.String m2();
Code:
0: ldc #7 // String foobar
2: astore_0
3: new #6 // class java/lang/String
6: dup
7: aload_0
8: invokespecial #8 // Method java/lang/String."<init>":(Ljava/lang/String;)V
11: areturn
}

关于jvm - javac 也内联吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19949748/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com