2006/12/28

今年の一言

「アスペクト指向萌ぇ」

某所で高校生にAOPを教えたんですが、最後までついてきた(めいっぱいハードル上げたのに)一人が最後に言い放った一言。

新しい世代の感覚でないと出ない言葉ですな。

2006/09/14

[aspectj-users] 特定のアノテーションを持つメソッドをもつクラスを指定したい

[aspectj-users] Annotations injection on types based on methods annotations

特定のアノテーションを持つメソッドを持つクラスを指定して、アノテーションを付加したい、って話。
WhiteDogでもこれができると@WhiteDogClassがいらなくなってちょっと楽。

結論としては、今は出来ないけど、最新版ではundocumentedなhasmethod、hasfieldってポイントカットが用意してあるらしい。

使い方は、コマンドラインオプションに-XhasMemberを指定した上で、以下のように記述:

-- 引用 --
public aspect LiftImmutability {
declare @type:
hasmethod(@Immutable * *(..)):
@Container;
}
----

まだITDを考慮してなくて正式サポートじゃないけど、これ使えるとちょっと記述の幅が広がるなぁ。
いい感じ。

2006/09/01

[aspectj-users] syntheticメソッドを指定したい

[aspectj-users] Excluding synthetic compiler methods

Javaコンパイラが生成するメソッドにsynthetic属性が付くのは周知だけど(嘘ですごめんなさい。この投稿で初めて知りました)、ポイントカットにそれを指定したいという話。
もしそこまでやるんだと、バイトコードレベルでのポイントカットをクリアにする必要性が出てくるなぁ。

投稿した人は、AspectJがsyntheticメソッドまでポイントカットの対象としていることを問題視して、それを省くために指定したいということだったんだけど、結局、その振る舞いはバグ(AspectJは本来syntheticメソッドには関わらない)で、AspectJがsyntheticをサポートすることはない(Java言語には無いので)ってことに。

[aspectj-users] クラスアノテーションとメソッドアノテーションの組み合わせ

[aspectj-users] Combination of Class Annotation and Method Annotation matching

僕の投稿なんですが。

class Base{ void func(){} }

@Annot
class Derived extends Base{
 @Annot void func(){}
}

こんなクラスがある場合、execution(@Annot * (!@Annot *).*(..))というポイントカットが、Derived.funcにマッチするのは何故?って話。

結論としては、AspectJのマッチング仕様としては正しい動作らしい。
AspectJのマッチングは、実際にはメソッドそのものではなくそのシグネチャとマッチングを行っていて、1つのメソッドは複数のシグネチャを持ち、かつアノテーション等のデジネータは上書きされるってことらしい。つまり、Derived.funcは、親クラスのfuncのシグネチャを引き継ぐため、"Base.func"と"@Annot void (@Annot Derived).func"の2つのシグネチャを持つ。で、前述のポイントカットは上書きされて"@Annot Base.func()"になるので、Derived.funcがマッチするそうな。

これをマッチさせないための対処としてはexecution(@Annot * *.*(..)) && !within(@Annot *)というポイントカットを使うこと。

なんか釈然としないので、その後も議論の継続を試みたのだけど、止まってしまった。
クラスアノテーションもオーバーライドされれば(void Derived.funcが@Annot void (@Annot Base).func()と扱われれば)、すっきりすると思うんだけどなぁ。

2006/08/15

[aspectj-users] 秀逸な突っ込み

[aspectj-users] Transparent Caching with AspectJ in 10 minutes

Piotrさんが、AspectJを使ったキャッシングに関する記事「AspectJを使った透過的キャッシュ」を書いたよ~ってMLでお知らせ。投稿のタイトルに"in 10 minutes"とあるんだけど、それに対してついたコメントが、
「ちょっとまった。ロギングにAspectJ使ってないじゃないか。
完全なものにするにはもう10分くらいかかるんじゃないかな。」
笑った。

2006/08/08

[aspectj-users] パラメータアノテーションのマッチング

[aspectj-users] Matching on parameter annotations

パラメータアノテーションは指定できないの?って話。

Java5からアノテーションが導入されて、様々な要素に注釈をつけることが可能になった。
で、あまりフォーカスされないんだけど、
public class Test{
 void func(@Annot int arg){
 }
}
ってな感じに、パラメータに対してもアノテーションが使える。

で、話の内容は、AspectJ5ではクラスやメソッドのアノテーションは扱えるけど、パラメータのアノテーションは扱えないの?ってこと。結論としては、現在のバージョン(1.5.2)では扱えないけど、将来扱えるようになるらしい。

2006/08/07

[aspectj-dev] AspectJをAspectJ自身の実装に使う

http://dev.eclipse.org/mhonarc/lists/aspectj-dev/msg02084.html
そろそろAspectJをAspectJ自身の実装に使っていってもいいんじゃないかって提案。
実際既に1つだけアスペクトが利用されてるんだけど、もっとがっつり使おうよってことらしい。
おもしろい。

2006/04/22

言語グリッドプロジェクト

4月から所属が変わって、今は言語グリッドプロジェクトに居ます。

人生初サラリーマン生活はなかなか厳しいものがあります。
まさかこんなに体調が良く&夜更かしが辛くなるとは。