首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何读取由分解的Java字节码生成的助记符元数据?

如何读取由分解的Java字节码生成的助记符元数据?
EN

Stack Overflow用户
提问于 2015-08-07 17:34:06
回答 2查看 315关注 0票数 0

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

代码语言:javascript
复制
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        
}

我在Spec中查找JVM,没有发现任何解释"Code:“的东西,但是如果我忽略了它,它很乐意发布到该部分的链接。谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-08-08 23:33:30

页面是一个链接的迷宫,因此,请允许我指出在哪里可以找到有关分解的字节码的确切信息。几乎所有关于分解字节码的内容都可以在3下找到。此外,我的问题的即时答案可以在这里找到示例格式

另外,锑的答案使人们更深入地了解了其他查看字节码的方法。

票数 1
EN

Stack Overflow用户

发布于 2015-08-08 01:14:35

Javap是一个用来帮助Java程序员调试代码的工具。它不是设计用来供工具使用的,也没有正式的输出规范。它可以而且确实在不同版本之间进行更改。

尽管如此,如果您了解JVM规范和类文件格式,那么很容易理解Javap的输出。

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

如果您想看到更接近字节码的内容,但仍然是人类可读的,我会推荐Krakatau反汇编程序 (公开,我写的)。还有很多其他的查看字节码的工具,它们几乎都比Javap好(要比Javap好并不难)。

此外,行号(0:)是多少?

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

不同的部分意味着什么(在下一行中,Public void ()后面跟着Code:),以及#number和注释意味着什么?

它显示了类中的每个方法,带有Java损坏的Java样式方法签名。然后是该方法字节码中每条指令的文本表示。同样,有关详细信息,请参阅JVM规范。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31883570

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档