あんまり難しいAOPではなく単純なダイナミックAOPの機能を作成中のDIコンテナに追加しました。過去にDIコンテナを作ったときに、ある程度使っていたAOPライブラリを外部化していたのですが、それを組み込むことにしました。
サポートしている条件としては、
- インターフェイス
- 抽象クラス
- 非finalの具象クラス
- 非finalメソッド
- 非brigedメソッド
- 非staticメソッド
というところです。staticメソッドやコンストラクタ、フィールドアクセス等は対象外にしています。
インターフェイスだけならjava.lang.reflect.Proxyだけでもいけるのですが、微妙に不都合もあるので全て自前実装です。それでもダイナミックAOPの実装はJavassist辺りのバイトコードライブラリに慣れていると比較的簡単です。
例えば具象クラスにアスペクトを織り込むのであれば、動的に継承したクラスを作成して、アスペクトの織り込む対象のメソッドのみを動的にオーバーライドします。自分の場合はポイントカットを動的にできるように、全てのメソッドに対してオーバーライドを行うようにしていますが、この辺は好みの問題でしょう。
インタセプタの類は全てAOP Allianceにも準拠しています。これならSpringやSeasar2用に作られたインタセプタも実行できます。AOPモジュールが元々クラスローダを変更できない作りになっているので、これから修正しなくては。