AOP(Aspectj)クラス内でメソッド引数を取得する

spring

AOP(Aspectj)を実現するアノテーションとして「@Before、@After、@AfterThrowing、@Around」があります。それぞれのアノテーションで実現したAOPクラス内で、対象となるメソッドの引数を取得することも可能です。

springでは、「@Before、@After、@AfterThrowing、@Around」を使って、メソッドの前後、例外時に処理を加えることが可能です。
もちろん処理を加えるときに、対象メソッドの引数を取得することも可能です。
今回は、AOPクラス内で「JoinPoint」を使って対象メソッドの引数を取得する方法を解説します。

[スポンサーリンク]

目次

  1. @Beforeで対象メソッドの引数を取得する
  2. @Afterで対象メソッドの引数を取得する
  3. @AfterThrowingで対象メソッドの引数を取得する
  4. @Aroundで対象メソッドの引数を取得する
  5. JoinPointの解説

@Beforeで対象メソッドの引数を取得する

	/**
	 * Before 時に引数を取得する方法です。
	 * 対象メソッドの「前」に本クラスが実行され、引数を取得します。
	 * 
	 */
	@Before("execution(* com.example.service.impl.*.*(..))")
	public void before(JoinPoint jp) {
		System.out.println("AOPクラスで、メソッド実行「前」に引数を取得します。");
		Object[] objArray = jp.getArgs();

		for (Object obj : objArray) {
			System.out.println("引数の値です。 : " + obj.toString());
		}
	}

@Afterで対象メソッドの引数を取得する

	/**
	 * After 時に引数を取得する方法です。
	 * 対象メソッドの「後」に本クラスが実行され、引数を取得します。
	 * 
	 */
	@After("execution(* com.example.service.impl.*.*(..))")
	public void after(JoinPoint jp) {
		System.out.println("AOPクラスで、メソッド実行「後」に引数を取得します。");
		Object[] objArray = jp.getArgs();

		for (Object obj : objArray) {
			System.out.println("引数の値です。 : " + obj.toString());
		}
	}

AfterThrowingで対象メソッドの引数を取得する

	/**
	 * 例外発生時に引数を取得する方法です。
	 * 対象メソッドの「前」に本クラスが実行され、引数を取得します。
	 * 
	 */
	@AfterThrowing(value="execution(* com.example..*.*(..))",
					throwing="ex")
	public void throwing(JoinPoint jp, Exception ex) {
		System.out.println("AOPクラスで、例外発生時に引数を取得します。");
		Object[] objArray = jp.getArgs();

		for (Object obj : objArray) {
			System.out.println("引数の値です。 : " + obj.toString());
		}
	}

@Aroundで対象メソッドの引数を取得する

	/**
	 * Around 時に引数を取得する方法です。
	 * 対象メソッドの「前後」に本クラスが実行され、引数を取得します。
	 * 
	 */
	@Around("execution(* com.example.service.impl.*.*(..))")
	public String around(ProceedingJoinPoint pj) throws Throwable {
		System.out.println("AOPクラスで、@Aroundを使って、メソッド実行「前後」に引数を取得します。");

		// ここで対象のメソッドを呼び出します。
		String message = (String)pj.proceed();

		Object[] objArray = pj.getArgs();

		for (Object obj : objArray) {
			System.out.println("引数の値です。 : " + obj.toString());
		}

		return message;
	}

JoinPointの解説

それぞれのメソッド引数に「JoinPoint」を指定しています。JoinPointのgetArgsメソッドで、対象メソッドの引数の取得が出来るようになります。
「@Around」だけは、引数「ProceedingJoinPoint」を使って、対象メソッドの引数を取得しています。(他アノテーションと多少異なります。)

注意

「@AfterThrowing」の引数、「JoinPoint」と「Exception」を逆にすると、実行時にエラーとなります。(ビルドはできるけど実行は出来ないというパターンです。)

executionについて

「execution」の記述形式については、こちらを参照して下さい。
executionの記述方法についてまとめました

最後に

いかがでしたか。「@Around、@Before、@After、@AfterThrowingn」で処理対象のメソッドの引数を取得する方法を解説しました。メソッドの引数の取得方法もそんなに難しいロジックではなかったかと思います。
次回は、springでこちらも代表的なアノテーション「@Pointcut」について解説していきたいと思います。