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クラスには織り込まれないんだよね。これってアスペクトはプログラムを直接配布しないとライブラリとして機能しないじゃないんか? と思うのだが、ちゃんとうまくできる方法があるのだろうか。