我之前从未使用过Javap。有人可以解释一下" Code"这个例子意味着什么?它出现了三次。在下面的线条后面的助记符的上下文中它意味着什么?它是否表示存在另一个Stack帧或什么?:
Compiled from "DocFooter.java"
public class DocFooter extends java.applet.Applet {
java.lang.String date;
java.lang.String email;
public DocFooter();
Code:
0: aload_0
1: invokespecial #1 // Method java/applet/Applet."<init>":()V
4: return
public void init();
Code:
0: aload_0
1: sipush 500
4: bipush 100
6: invokevirtual #2 // Method resize:(II)V
9: aload_0
10: aload_0
11: ldc #3 // String LAST_UPDATED
13: invokevirtual #4 // Method getParameter:(Ljava/lang/String;)Ljava/lang/String;
16: putfield #5 // Field date:Ljava/lang/String;
19: aload_0
20: aload_0
21: ldc #6 // String EMAIL
23: invokevirtual #4 // Method getParameter:(Ljava/lang/String;)Ljava/lang/String;
26: putfield #7 // Field email:Ljava/lang/String;
29: return
public void paint(java.awt.Graphics);
Code:
0: aload_1
1: new #8 // class java/lang/StringBuilder
4: dup
5: invokespecial #9 // Method java/lang/StringBuilder."<init>":()V
8: aload_0
9: getfield #5 // Field date:Ljava/lang/String;
12: invokevirtual #10 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
15: ldc #11 // String by
17: invokevirtual #10 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
20: invokevirtual #12 // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
23: bipush 100
25: bipush 15
27: invokevirtual #13 // Method java/awt/Graphics.drawString:(Ljava/lang/String;II)V
30: aload_1
31: aload_0
32: getfield #7 // Field email:Ljava/lang/String;
35: sipush 290
38: bipush 15
40: invokevirtual #13 // Method java/awt/Graphics.drawString:(Ljava/lang/String;II)V
43: return
}
我查看了JVM的规范并没有找到任何解释&#34;代码:&#34;,但如果事实证明我忽略它很高兴发布该部分的链接。感谢。
答案 0 :(得分:1)
Javap是一个旨在帮助Java程序员调试代码的工具。它不是为了被工具使用而设计的,并且没有正式的输出规范。它可以并且确实在不同版本之间发生变化。
话虽这么说,如果你理解JVM规范和类文件格式,它很容易理解Javap的输出。
另请注意,Javap尝试使事情更像Java,这隐藏或掩盖了字节码的一些细节。例如,它输出Java样式方法签名,它不必反映字节码中的内容(并隐藏合成参数)。
如果你想看到的东西更接近字节码,但仍然是人类可读的,我推荐Krakatau disassembler(披露,我写了)。还有许多用于查看字节码的其他工具,它们几乎都比Javap更好(它不比Javap更好)。
此外,行号(0 :),
是什么
行号只是字节码中该指令的偏移量。它从0开始,大多数指令是1或3个字节。有关详细信息,请参阅JVM规范。
不同部分的含义是什么(Public void init()后跟Code:在下一行),#[number]和注释是什么意思?
它显示了类中的每个方法,带有Javap-mangled Java样式方法签名。然后是该方法的字节码中每条指令的文本表示。再次,请参阅JVM规范了解详细信息。
答案 1 :(得分:1)
Java虚拟机规范页面是链接的迷宫,因此,请允许我指出可以找到反汇编字节码的确切信息。大多数关于反汇编字节码的所有内容都可以在 3下找到。编译Java虚拟机。此外,我可以在Format of Examples找到我的问题的直接答案。
另外,锑的回答让我们更深入地了解了查看字节码的其他选择。