使用 javap 读取字节码
Using javap for reading the byte code
在网上看了一下发现java编译
public class Test {
private String s = "TESTTEST";
}
至
public class Test {
private String s;
public Test() {
s = "TESTTEST";
}
}
我说得对吗?
现在我试着自己理解这个。所以我通过调用
编译classTest.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
参数才能看到私有成员。为了查看多个构造函数会发生什么,我添加了一个额外的构造函数。
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
}
教你字节码超出了 Whosebug 的范围。有关字节码指令的完整列表,请参阅 The Java Virtual Machine Instruction Set。
jclasslib Bytecode viewer的到来给你带来了挑战和机遇。
在网上看了一下发现java编译
public class Test {
private String s = "TESTTEST";
}
至
public class Test {
private String s;
public Test() {
s = "TESTTEST";
}
}
我说得对吗?
现在我试着自己理解这个。所以我通过调用
编译classTest.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
参数才能看到私有成员。为了查看多个构造函数会发生什么,我添加了一个额外的构造函数。
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
}
教你字节码超出了 Whosebug 的范围。有关字节码指令的完整列表,请参阅 The Java Virtual Machine Instruction Set。
jclasslib Bytecode viewer的到来给你带来了挑战和机遇。