我在互联网上读到java编译
public class Test {
private String s = "TESTTEST";
}至
public class Test {
private String s;
public Test() {
s = "TESTTEST";
}
}我说的对吗?
现在我试着自己去理解这一点。因此,我通过调用Test.java来编译类
javac Test.java之后,我读到我可以使用javap读取编译后的代码(=字节码)。
因此,我尝试在字节码中看到编译器的重构,我在前面提到过(解密在构造函数中)。但是怎么做呢?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
}发布于 2016-03-31 20:32:59
因为您的字段是private,所以还需要提供-p参数来查看私有成员。为了了解多个构造函数会发生什么,我添加了一个额外的构造函数。
class Test {
private String s = "TESTTEST";
Test() {
}
Test(int x) {
}
}javap -c -p Test.classclass 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的范围。有关字节码说明的完整列表,请参见Java虚拟机指令集。
发布于 2020-08-05 09:17:32
jclasslib字节码查看器的到来给您带来了挑战和机遇。
https://stackoverflow.com/questions/36342953
复制相似问题