プログラム悪戦苦闘日記

はてなダイアリーからの移行(遺物)

AspectJをやってみた2

 このメモ、3回くらいでネタ切れになると思ったけど、しばらくAspectJネタでつなげそうだ。

 Javaは1クラス=1classファイルになるから、クラスの境界=バイナリ境界になっているんだよね(えっ COMってなんですか?)。アスペクトコンパイルすると、クラスと同様に同名のclassファイルを作る。たとえば、
HogeAspect.java → HogeAspect.class
というように。だから、クラスと同様にJARでまとめてライブラリとして配布、なんて考えていたら警告がでて織り込みができなかった。
 よく考えてみれば当然で、アスペクトコンパイル時に織り込み先のクラス(やアスペクト)に直接織り込まれるわけだから、

// Hoge.java
public class Hoge {
    public void hello() { System.out.println("ほげ"); }
}

// HogeAspect.java
public aspect HogeAspect {
    before() : atHallo(Hoge.hello()) { System.out.println("" + thisJoinPoint); }
}

とクラスとアスペクトがあって、先にアスペクトだけコンパイルしてHogeAspect.classを配布しても、Hogeクラスには織り込まれないんだよね。これってアスペクトはプログラムを直接配布しないとライブラリとして機能しないじゃないんか? と思うのだが、ちゃんとうまくできる方法があるのだろうか。