PR
図8●アスペクトの適用方法</b><BR>静的なアスペクトの適用では,クラスとアスペクトをコンパイル時に結びつけて,従来の実行環境で動作するバイナリ・ファイルを生成する。ほとんどのアスペクト指向プログラミング環境がこの方式を採用している。一方,クラスとアスペクトの情報を別々にコンパイルし,実行時に独自の実行環境が結びつける動的なアスペクトの適用もある。JBoss AOP,AspectWerkzなどがこの機能に力を入れている。
図8●アスペクトの適用方法</b><BR>静的なアスペクトの適用では,クラスとアスペクトをコンパイル時に結びつけて,従来の実行環境で動作するバイナリ・ファイルを生成する。ほとんどのアスペクト指向プログラミング環境がこの方式を採用している。一方,クラスとアスペクトの情報を別々にコンパイルし,実行時に独自の実行環境が結びつける動的なアスペクトの適用もある。JBoss AOP,AspectWerkzなどがこの機能に力を入れている。
[画像のクリックで拡大表示]

さまざまな実装が出揃う

 現在では,AspectJ以外にもさまざまなアスペクト指向プログラミング環境が登場している。DIコンテナ同様,Javaによる実装が多い。ただ一口にJavaによる実装と言っても,その実現手法は多様である。

 中でも注目度が高いのが,オープンソースのJ2EEアプリケーション・サーバーの開発で知られる米JBoss社が用意する「JBoss AOP」と,米BEA Systems社が開発に協力する「Aspect-Werkz」である。この二つは後発である点を生かして,AspectJに比べて現場の開発者のニーズに即した特徴を盛り込んでいる。AspectJとの違いは主に二つ。アスペクトの適用方法と,言語仕様である。

 アスペクトの適用方法には,静的な適用と動的な適用の二つがある(図8[拡大表示])。基本的なのが静的なアスペクトの適用で,コンパイル時にクラス中にアスペクトを適用するというやり方だ。AspectJは,この方法を採用している。クラスの定義と,それに適用するアスペクトの定義を合わせてコンパイルする。

 JBoss AOPやAspectWerkzも,これと同じ静的な適用機能を備える。さらに,両者とも動的な適用機能にも力を入れている。実行時に,対象のクラスに対してアスペクトを適用するのである。例えばJBoss AOPでは,Java仮想マシンにおいてクラスをロードする処理を担当する「ClassLoader」というクラスを利用する。ClassLoaderを取得してその処理にフックをかけ,アスペクトを適用するクラスがロードされる前に,そのバイトコードを書き換える。東京工業大学の千葉助教授が開発した「Javassist」というバイトコード変換のライブラリを使って実現している。AspectJも最新版で動的な適用に対応したが,やはり軸足は静的な適用に置いているようだ。

 もう一つの違いが,言語仕様の違い。AspectJは,Javaを拡張したアスペクト指向用の新たな言語である。アスペクトは特殊なキーワードを使って,ソースコードに記述する。一方JBoss AOPやAspectWerkzは,Java言語の枠組みの中でアスペクト指向プログラミングを可能にしている。アスペクトは通常のJavaのソースコードとして定義し,クラスとの結びつけの情報はXMLファイルで記述する。「言語拡張は,現場の開発者から見ると敷居が高い。XMLファイルで設定する方が受け入れられやすいのではないか」(日本IBM ストラテジー&コンピテンシー テクニカル・マネジメント ソフトウェア・エンジニアリング ITスペシャリストの太田健一郎氏)。

 こうした状況を受けて,AspectJとAspectWerkzの統合が発表されている。AspectJの独自の言語仕様は残り続けるものの,アノテーションやXMLファイルを利用して,Java言語の範囲内でアスペクトを定義する仕組みを用意する方針である。つまり,どちらの方法でも開発が続けられるようになる見込みだ。また統合される言語では,動的なアスペクトの適用機能の強化も図られる。