0

我以前从未使用过Javap。有人可以解释这个例子中的“代码”是什么意思吗?它出现了三次。在下面几行的助记符的上下文中,它是什么意思?它是否表明还有另一个堆栈框架或其他东西?:

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 的规范并没有找到任何解释“代码:”的内容,但如果事实证明我忽略了它,我很高兴发布该部分的链接。谢谢。

4

2 回答 2

1

Javap 是一个旨在帮助 Java 程序员调试代码的工具。它不是为工具使用而设计的,并且没有正式的输出规范。它可以而且确实会随着版本的变化而变化。

话虽如此,如果您了解 JVM 规范和类文件格式,就很容易理解 Javap 的输出。

另请注意,Javap 试图使事情更像 Java,它隐藏或掩盖了字节码的一些细节。例如,它输出 Java 风格的方法签名,它不需要反映字节码中的内容(并且它隐藏了合成参数)。

如果你想看到更接近字节码的东西,但仍然是人类可读的,我推荐Krakatau 反汇编器(披露,我写的)。还有很多其他的查看字节码的工具,它们几乎都比Javap好(比Javap好一点也不难)。

此外,行号是什么(0:),

行号只是该指令在字节码中的偏移量。它从 0 开始,大多数指令是 1 或 3 个字节。有关详细信息,请参阅 JVM 规范。

不同部分是什么意思(Public void init() 后跟 Code: 在下一行),#[number] 和注释是什么意思?

这显示了类中的每个方法,带有 Javap-mangled Java 样式的方法签名。然后是该方法字节码中每条指令的文本表示。再次,请参阅 JVM 规范以获取详细信息。

于 2015-08-08T01:14:35.587 回答
1

Java 虚拟机规范页面是一个迷宫般的链接,因此,请允许我指出可以找到反汇编字节码信息的确切位置。大部分关于反汇编字节码的内容都可以在3. 为 Java 虚拟机编译中找到。此外,我的问题的直接答案可以在这里找到示例格式

此外,Antimony 的回答更深入地了解了查看字节码的其他替代方案。

于 2015-08-08T23:33:30.723 回答