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 の仕様を調べたところ、「Code:」を説明するものは何も見つかりませんでしたが、見落としていることが判明した場合は、そのセクションへのリンクを投稿してください。ありがとう。

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 マングルされた Java スタイルのメソッド シグネチャを使用して、クラス内の各メソッドを示しています。次に、そのメソッドのバイトコード内の各命令のテキスト表現が続きます。繰り返しますが、詳細については JVM 仕様を参照してください。

于 2015-08-08T01:14:35.587 に答える
1

Java Virtual Machine Spec ページはリンクの迷宮なので、逆アセンブルされたバイトコードに関する正確な情報が見つかる場所を指摘させてください。逆アセンブルされたバイトコードに関するほとんどすべては、3. Compiling for the Java Virtual Machine にあります。さらに、私の質問に対する即時の回答は、こちらの Format of Examples にあります。

さらに、アンチモンの回答は、バイトコードを表示するための他の代替手段についてより多くの洞察を与えてくれます。

于 2015-08-08T23:33:30.723 に答える