質問

ターゲットは、Java同期ブロックのエントリと終了を監視するためのコードを挿入することです。

すき。

enteringSync();
synchronized(lockObj){
enteredSync();

   ...

leavingSync();
}
leftSync();
.

私のオリジナルの考えは、Enter / Exitリスナーメソッド(Java Synchronizdブロックの周囲にサブツリーを追加する)を実装し、次に結果として生成されたASTを印刷することでした。今、AntLR4が木の修正をサポートしていないようであることに気づきました。

役に立ちましたか?

解決

最良の解決策は、解析木を操作するのではなくトークンストリーム書き換えエンジンを使用することです。例としての本。 http://amzn.com/1934356999 。これは、シリアル化識別子をクラスボディに挿入するコードスニペットです。

public class InsertSerialIDListener extends JavaBaseListener {
    TokenStreamRewriter rewriter;
    public InsertSerialIDListener(TokenStream tokens) {
        rewriter = new TokenStreamRewriter(tokens);
    }
    @Override
    public void enterClassBody(JavaParser.ClassBodyContext ctx) {
        String field = "\n\tpublic static final long serialVersionUID = 1L;";       
        rewriter.insertAfter(ctx.start, field);
    }
}
.

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top