gpt4 book ai didi

java - 使用 javap 读取字节码

转载 作者:行者123 更新时间:2023-11-30 08:03:20 25 4
gpt4 key购买 nike

在网上看java编译才知道

public class Test {
private String s = "TESTTEST";
}

public class Test {
private String s;

public Test() {
s = "TESTTEST";
}
}

我说得对吗?

现在我试着自己理解这个。所以我通过调用编译类 Test.java

javac Test.java

在它之后,我读到我可以使用 javap 来读取编译后的代码(=字节码)。

所以我试图在字节码中看到编译器的重组,我在上面提到过(decleration 在构造函数中)。但是怎么办?? javap 是合适的工具吗?如果是,使用哪些参数?

感谢您的帮助!

编辑:

好的,到目前为止谢谢!你能解释一下如何读取 javap -c Test 的输出吗?

C:\Users\MyName\Desktop>javap -c Test
Compiled from "Test.java"
public class Test {
public Test();
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: aload_0
5: ldc #2 // String TESTTEST
7: putfield #3 // Field s:Ljava/lang/String;
10: return
}

最佳答案

由于您的字段是private,您还需要提供-p 参数以查看私有(private)成员。为了查看多个构造函数会发生什么,我添加了一个额外的构造函数。

class Test {
private String s = "TESTTEST";
Test() {
}
Test(int x) {
}
}
javap -c -p Test.class
class Test {
private java.lang.String s;

Test();
Code:
0: aload_0
1: invokespecial #10 // Method java/lang/Object."<init>":()V
4: aload_0
5: ldc #12 // String TESTTEST
7: putfield #14 // Field s:Ljava/lang/String;
10: return

Test(int);
Code:
0: aload_0
1: invokespecial #10 // Method java/lang/Object."<init>":()V
4: aload_0
5: ldc #12 // String TESTTEST
7: putfield #14 // Field s:Ljava/lang/String;
10: return
}

在两个构造函数中,这基本上是:

<constructor> {
super(); // Instructions: 0, 1
this.s = "TESTTEST"; // Instructions: 4, 5, 7
return; // Instructions: 10
}

教你字节码超出了 StackOverflow 的范围。参见 The Java Virtual Machine Instruction Set字节码指令的完整列表。

关于java - 使用 javap 读取字节码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36342953/

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