by shigemk2

当面は技術的なことしか書かない

クラスファイルの LineNumberTableとLocalVariableTableについて

こいつをコンパイルして逆アセンブルしてみました。

gist.github.com

逆アセンブル結果がこちら。

  public void main(java.lang.String[]);
    flags: ACC_PUBLIC
    Code:
      stack=2, locals=3, args_size=2
         0: iconst_1      
         1: istore_2      
         2: iload_2       
         3: iconst_2      
         4: iadd          
         5: istore_2      
         6: return        
      LocalVariableTable:
        Start  Length  Slot  Name   Signature
               0       7     0  this   LPlusScala$;
               0       7     1  args   [Ljava/lang/String;
               2       4     2     a   I
      LineNumberTable:
        line 3: 0
        line 4: 2

LocalVaribleTableとLineNumberTableってなんぞ。っていうはなし。

www.s-cradle.com

LineNumberTable はそのバイトコードとソース上の行番号の対応がかかれています。LocalVariableTable は、メソッド内で宣言した変数の名前などを保持したものです。 LineNumberTable と LocalVariableTable は主にデバッグ時に用いられ、実行時には不必要な属性です。

という説明なので、実際に読むときは必要のないものだったりするようです。

確かに、仕様書を読むとどちらもデバッガが見る情報みたいですね。