2

.class ファイルを操作しています。InstrutionHandleパッケージを使用して、一度に 1 つずつ指示を取得しています。getPosition()メソッドで命令のバイト オフセットを取得しています。バイト オフセットからソース行番号を取得できますか?

4

1 に答える 1

3

これは、クラスファイルがデバッグ情報でコンパイルされているかどうかによって異なります。通常、コンパイラはLineNumberTable、バイトコードの各範囲に対応する元のソース行番号を与える属性を挿入します。ただし、LineNumberTable属性は単なるメタデータであるため、作成者は、わずかな制約を付けて必要なものをそこに入れるか、完全に省略することができます。(通常、難読化ツールを使用してコンパイルする-g: noneか、難読化ツールを実行することによって行われます)

とにかく、属性の形式は、全体の数 (2 バイト) の後に (開始 pc、行番号) のペア (両方とも 2 バイト) が続きます。LineNumberTable複数の属性を持つこともできます。もちろん、ライブラリを使用している場合は、おそらく既にこれらをデコードしています。

于 2012-11-22T06:43:06.247 に答える