Josh : バイトコードレベルでの Java用 Aspect Weaver

Josh : バイトコードレベルでの
Java用 Aspect Weaver
中川 清志
1
アスペクト指向
オブジェクト指向はモジュラリティが優れて
いるが限界もある
ある種の処理は複数のオブジェクトに散ら
ばってしまいモジュラリティが悪化する

ログ処理などのシステマティックな処理
そのような処理をアスペクトとしてモジュー
ル化するのがアスペクト指向である
2
例 : ログ出力
class Car{
void start() {
Log.print(“start”);
class Bike{
void start() {
Log.print(“start”);
..
}
void back() {
Log.print(“back”);
}
}
..
}
}
..
class Log {
static void print(String msg) {
System.out.println(msg);
}
}
ログ出力をするタイミングを変えるような変更の度に,
Car,Bikeクラスのソースコードを修正しなければならない
3
AspectJ
AspectJは汎用アスペクト指向言語の代表的なもの
aspect LogOut{
before() : execution(void Car.start()) {
Log.print(“start”); }
before() : execution(void Car.stop()) {
Log.print(“stop”); }
…
}
散らばっていたコードをアスペクトに集約できる
アスペクトは,プログラムのjoin point(メソッド呼び出し,
フィールド参照など)にコード断片の埋め込みを指示
4
AspectJの weave の欠点
java source
aspect
Weave

コード断片を Java プログ
ラムに埋め込む処理
コンパイル時 weave

分割コンパイルできない
 アスペクトを変更したら
ソースコードも再コンパイ
ルしなければならない

weaver
ソースコードが必要
weaved
source
 サードパーティ製のクラス
には使えない
 動的ロードに不向き
AspectJ
コンパイラ
weaved
bytecode
compiler
5
本研究の提案 : Josh
欠点に対応した新コン
パイラJoshを提案



java source
compiler
local disk
ロード時に、バイトコード
レベルでweave
bytecode
アスペクトを変更しても
ソースの再コンパイルの
必要がない
ソースコード無しクラス
にも適用できる
weaved
bytecode
weaver
部分
コンパイラ
Josh
aspect
部分コンパイラ
役割 : ソースコードで存在する,アスペクト
内のJavaコード断片をバイトコード化
ダミークラスにコード断片を埋め込んで通
常のJavacでコンパイル
public class Dummy {
void getName() {}
void dummyMethod() {
Log.print(“ start”);
}
}
埋め込み先のクラスのダ
ミーメソッド
コード
断片
7
Josh Weaver
役割 : アスペクトのバイトコードをロード時
にJavaバイトコードに埋め込む



Javassistが提供する構造リフレクションを使い
実装した
プログラムのバイトコードを調べてJoin-point
を見つけ出す
バイトコードを編集してアスペクトのバイトコー
ド断片を埋め込む
8
Weave のオーバヘッドの測定
実
行
時
間
[
]
ミ
リ
秒
SparcIII 750MHz
J2SE 1.3.1
クラスファイルのサイズ [KByte]
9
まとめ
AspectJ言語の新コンパイラJoshを提案
Joshの weave

ロード時
バイトコードレベル

分割コンパイル可能

 アスペクト変更による再コンパイルの手間を省ける

ソースコードなしクラスにも適用できる
 サードパーティライブラリもOK
 動的ロードにも対応
10