1

asm ライブラリを使用してメソッドのバイトコードをきれいに印刷したいとしましょう。

public int get777() { return 777; }

を通じてTraceClassVisitor次のようになります

  // access flags 0x1
  public get777()I
   L0
    LINENUMBER 21 L0
    SIPUSH 777
    IRETURN
   L1
    LOCALVARIABLE this Lsomething/Point; L0 L1 0
    MAXSTACK = 1
    MAXLOCALS = 1
}

今、事は私が気にすることだけです

    SIPUSH 777
    IRETURN

他のすべては私にはほとんど関係がないので、それらを一掃したいと思います。

を継承して不要なものをフィルタリングすることを考えましTraceMethodVisitorたが、実際には final クラスであることが判明しました (残念!)。

の出力をフォーマットする方法はありますTraceClassVisitorか? そうでない場合、私が気にしないものを除外するための最良のアプローチは何だと思いますか?

4

3 に答える 3

1

ClassReader.SKIP_DEBUG フラグを ClassReader.accept() メソッドに渡すことで、行番号とローカル変数情報を取り除くことができます。

別のアプローチは、出力に表示したくないイベントを飲み込む TraceClassVisitor と TraceMethodVisitor の前にビジターを追加することです。

于 2011-11-02T12:30:35.277 に答える
1

TraceClassVisitor(ClassVisitor,Printer,PrintWriter)コンストラクターを介して、独自のプリンター(おそらくTextifierへの拡張または委任) を提供することを検討します。私はこのアプローチをテストしていません。

于 2011-11-02T12:48:52.233 に答える
0

私の標準的なアプローチ: ソース コードを取得し、検索して置換final class->classし、再コンパイルします。

于 2011-11-02T10:09:45.150 に答える