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
© Copyright 2024 ExpyDoc