かずきのBlog@hatena

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

AspectJでHelloWorld

朝インストールして仕事後にHello world!!!
AJDTを入れるとAspectJプロジェクトが作れる。
サクッと作成。


そこに、普通のJavaのクラスを作成する。

package org.okazuki.aspectj.hello;

public class HelloWorld {
	public void sayHello() {
		System.out.println("Hello world");
	}
	public static void main(String[] args) {
		HelloWorld helloWorld = new HelloWorld();
		helloWorld.sayHello();
	}
}

今まで何百回・何千回?と書いてきたHello worldなので間違いは無い!
しいて言うならば、Hello worldにしては大げさすぎるくらいだろうか。


実行結果は自明なので省略。


いよいよここからが本番。Aspect作りに入る。
とりあえず、定番のsayHelloの前後に処理を挟みこむということをしてみる。

アスペクトの定義は

public aspect 名前 {
}

でやるらしい。

とりあえず右クリック新規作成からアスペクトを作成すれば、そこらへんはIDEがよきにはからって作ってくれる。
メソッドの前に処理を入れる場合はbefore、後に処理を入れる場合にはafterというものを使うらしい。
これもエディタでbeforeとかafterって打ち込んでCtrl+Spaceでペコっと作ってくれる。
便利な世の中じゃ。

とりあえずこんな感じで書くらしい

before() : 何処に挟み込むか {
  挟み込む処理
}

何処に挟み込むかの部分をsayHelloに指定するには

before() : execution(public void org.okazuki.aspectj.hello.HelloWorld.sayHello()) {
  挟み込む処理
}

と書く。


和訳してみると

前に : 実行の(public void org.okazuki.aspectj.hello.HelloWorld.sayHello()) {
}

日本語っぽく並べると「public void org.okazuki.aspectj.hello.HelloWorld.sayHelo()の実行の前に」って感じかな?

挟み込む処理は簡単にsysoutしちゃいます

before() : execution(
		public void org.okazuki.aspectj.hello.HelloWorld.sayHello()) {
	System.out.println("before Hello world");
}

後に挟み込む処理は、after() returning()というのを指定するらしい。
書き方は、こんな感じ。

after() returning() : execution(
		public void org.okazuki.aspectj.hello.HelloWorld.sayHello()) {
	System.out.println("after Hello world");
}

executionとかわかんね〜よ!って思ってもexeとかまで打ち込んでCtrl+Spaceでサクッとある程度書いてくれる。
IDEさまさま。

これでHelloWorldAspectは、こんな感じに仕上がる

package org.okazuki.aspectj;

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

	after() returning() : execution(
			public void org.okazuki.aspectj.hello.HelloWorld.sayHello()) {
		System.out.println("after Hello world");
	}
}

beforeの行と、afterの行に変なマーカーがつく。
マーカーで右クリックしてAdvicesメニューを見ると、HelloWorldのsayHelloメソッドが出てくる。
クリックすると移動する。
多分これがでないって時は何か間違ってるのだろう。


ここまできたら実行!!

before Hello world
Hello world
after Hello world

ちゃんと出たど〜!