AspectJ WeaverとAspectJ Runtimeの役割とは?
AspectJはAspect指向プログラミング(AOP)のための拡張であり、AspectJweaverとAspectJrtの2つのコンポーネントを含んでいます。
AspectJweaverは、AspectJのAspectコードをJavaコードに織り込むコンパイラとクラスローダーです。コンパイルとロードの際にAspectコードをターゲットコードに挿入することでAOP機能を実現します。コマンドラインツール、Antタスク、Mavenプラグインから利用可能です。
AspectJrtはAspectJのランタイムライブラリで、実行時に必要なクラスとメソッドを含んでいます。その役割は、プログラムの実行時にAOP機能のサポートを提供することです。AspectJrtはJavaアプリケーションのクラスパスに追加することで、実行時に織り込み済みのアスペクトコードを実行できます。
例えば:
仮にログ管理システムがあり、プログラム上でメソッドの実行時間を記録したい場合、AspectJを使用することで実現できます。まず、メソッドの実行を横断するアスペクトクラスを定義する必要があります。次に、AspectJweaverを使用してアスペクトコードを対象コードに織り込みます。最後に、プログラムを実行すると、AspectJrtはメソッドの実行時にアスペクトコードを呼び出し、メソッドの実行時間を記録します。
断面図の例
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
@Aspect
public class LoggingAspect {
@Around("execution(* com.example.MyClass.*(..))")
public Object logMethodExecutionTime(ProceedingJoinPoint joinPoint) throws Throwable {
long startTime = System.currentTimeMillis();
Object result = joinPoint.proceed();
long endTime = System.currentTimeMillis();
System.out.println("Method execution time: " + (endTime - startTime) + " milliseconds");
return result;
}
}
AspectJweaverを活用し、コンパイルとロード時にターゲットコードへアスペクトコードを織り込む
ajc -inpath path/to/aspectjrt.jar -aspectpath path/to/aspectjweaver.jar -sourcepath path/to/source/files -d path/to/output/files
最後に、プログラムの実行時に AspectJrt をクラスパスに追加します。
java -cp path/to/aspectjrt.jar:path/to/program.jar com.example.MainClass
これにより、プログラム実行時に、メソッド実行時にメソッドの実行時間を記録する、アスペクトコードが呼び出されます。