AspectJが生成したコードの逆コンパイル

almadenさんご紹介のDJを使ったら、サクッと逆コンパイルできました。次のコードは以前作ったZipViewタスクにbefore, afterアドバイスを適用したものです:

public void printTree(FileItem root)
    {
        FileItem fileitem = root;
        Object aobj[] = new Object[1];
        aobj[0] = fileitem;
        org.aspectj.lang.JoinPoint joinpoint = Factory.makeJP(ajc$tjp_0, this, this, aobj);
        try
        {
            SVGPrinterAspect.aspectOf().ajc$before$neverbird_tools_ant_zipview_TraceAspect$e7(ajc$tjp_0, joinpoint);
            //
            // 元々のコードがここにある。
            //
        }
        catch(Throwable throwable)
        {
            SVGPrinterAspect.aspectOf().ajc$after$neverbird_tools_ant_zipview_TraceAspect$1e9();
            throw throwable;
        }
        SVGPrinterAspect.aspectOf().ajc$after$neverbird_tools_ant_zipview_TraceAspect$1e9();
    }

before、afterアドバイスに相当するメソッドの呼び出しコードが、AspectJ Weaverによって上記printMethodの該当箇所に挿入されているのがわかります。beforeアドバイスではthisJoinPointStaticPartとthisJoinPointを使っているので、printTreeメソッドの中でそれらをbeforeアドバイスに相当するメソッドに対して引数として渡しています。一方、afterアドバイスでは、それらを参照していないので引数は空です。

AspectJに関して本当に知りたいのはmix-inがどのようにバイトコードレベルで実現されているかです。これもそのうち気が向いたら調べてみます。