かずきのBlog@hatena

すきな言語は C# + XAML の組み合わせ。Azure Functions も好き。最近は Go 言語勉強中。日本マイクロソフトで働いていますが、ここに書いていることは個人的なメモなので会社の公式見解ではありません。

アノテーション版!

前の日記で書いたAspectJのハローワールドをアノテーションを使ったものに書きかえてみた。

書き換え前

package org.okazuki.aspectj.hello;

public aspect HelloWorldAspect {
	
	pointcut sayHello() : execution(public void HelloWorld.sayHello());
	
	before() : sayHello() {
		System.out.println("before Hello world");
	}

	after() returning() : sayHello() {
		System.out.println("after Hello world");
	}
}

書き換え後

package org.okazuki.aspectj.hello;

import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;

@Aspect
public class AnnotationAspect {

	@Pointcut("execution(public void HelloWorld.sayHello(..))")
	public void sayHello() {
	}
	
	@Before("sayHello()")
	public void before() {
		System.out.println("before Hello world");
	}
	
	@After("sayHello()")
	public void after() {
		System.out.println("after Hello world");
	}
}


Aroundのほうも

書き換え前

package org.okazuki.aspectj.hello;

public aspect HelloWorldAspect {
	
	pointcut sayHello() : execution(public void HelloWorld.sayHello());
	
	void around() : sayHello() {
		System.out.println("around Hello world");
		proceed();
		System.out.println("around Hello world");
	}
}

書き換え後

package org.okazuki.aspectj.hello;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;

@Aspect
public class AnnotationAspect {

	@Pointcut("execution(public void HelloWorld.sayHello(..))")
	public void sayHello() {
	}
	
	@Around("sayHello()")
	public void around(ProceedingJoinPoint joinPoint) throws Throwable {
		System.out.println("around Hello world");
		joinPoint.proceed();
		System.out.println("around Hello world");
	}
}


完璧にJavaになってる!ってのが嬉しいところ。
ただ、pointcutを定義するときにIDEのコード支援を使わないと書けない体なのでちょっと辛い。
@Pointcut()までうって括弧のなかでコード支援使ってexecution ....を書いてから、""でかこって文字列にしよう。
それが楽。