各メソッドに2つのパスを必要とする変換をASMに実装しようとしています。1つ目はインストルメンテーションが必要な場所に関する情報を収集し(ジャンプターゲットと関係があるため、2つのパスが必要です)、2つ目は収集した情報を完成させてインストルメンテーションを追加します。これは、2番目のパスを開始する前に、最初のパスを完了する(つまり、すべての命令を処理する)必要があることも意味します。そのため、マニュアルで説明されている通常の連鎖パターンは機能しません。
私の質問は:それを行うためのエレガントで便利な方法はありますか?
これまでに思いついた唯一の解決策は、最初のビジターのvisitEnd()から2番目のビジターを呼び出すことです。アウトラインはこんな感じ
public class Pass1Visitor extends MethodVisitor {
...
public void visitEnd() {
//do stuff the call the second visitor
thisMethodNode.accept( new Pass2Visitor() );
}
}
私はこのソリューションがあまり好きではありません。将来、より多くの訪問者を連鎖させる必要があり、選択して選択できるようにしたいと思うからです。これでは実際には不可能です。