かずきのBlog@hatena

日本マイクロソフトに勤めています。XAML + C#の組み合わせをメインに、たまにASP.NETやJavaなどの.NET系以外のことも書いています。掲載内容は個人の見解であり、所属する企業を代表するものではありません。

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

ちゃんと出たど〜!