朝インストールして仕事後に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
ちゃんと出たど〜!