post-compile weaving 実践メモ

AspectJ (Springに統合された?)による post-compile weaving を実践したのでメモ。
jarに固められ済みのものに自由に追記できちゃうわけで、悪用にならないように要注意。

ウィービングのタイミングの種類

以下の3種類のタイミングがある。

  • compile-time weaving: 織り込み対象のコンパイル時に織り込む
  • post-compile weaving: コンパイル済みの織り込み対象に織り込む
  • load-time weaving: クラスのロードのタイミングで織り込む

AOPコード

ポイントカット

織り込み対象のメソッドを指定して定義する。プライベートメソッドも指定可能。

@Pointcut("execution (void test.Main.method1(..)) && args(str)")
public void method1PointCut(String str) {}

※ポイントカットの文法は「Springのポイントカットの記法詳細 - oknknicの日記」を参照。

アドバイス

上記で定義したポイントカットを指定する。引数リストの末尾にJoinPointを受け取ることができる。

@After("method1PointCut(str)")
public void advice1(String str, JoinPoint joinPoint) {
 // 任意の処理
}

ウィービング手順

1. AspectJのインストール。手順は「AspectJのインストール」を参照。
2. ウィービング実施

SET CLASSPATH=%ASPACRJ_HOME%\lib\aspectjrt.jar;%ASPACRJ_HOME%\lib\aspectjtools.jar;
SET TARGET=織り込み対象のjarファイルのパス
SET ASPECT=織り込むAOPコードのクラスファイルが格納されているディレクトリのパス
SET OUT=織り込み後のjarを出力するファイルパス
java -cp %CLASSPATH% org.aspectj.tools.ajc.Main -source 1.6 -inpath %TARGET%;%ASPECT% -outjar %OUT%