Java における 先進的リフレクション技術

Java における
先進的リフレクション技術
-
OpenJava, Javassist
立堀(筑波大)、千葉(東工大)
Sep. 25, 2001
The Java Technology Workshop,
Reflection 2001, Kyoto, Japan,
1
この話は…
構造リフレクション・システム、OpenJava
と Javassist の紹介
Javassist を利用したアプリケーション
Addistant の紹介
Sep. 25, 2001
The Java Technology Workshop,
Reflection 2001, Kyoto, Japan,
2
構造リフレクションと
プログラム変換
OpenJava と Javassist
Sep. 25, 2001
The Java Technology Workshop,
Reflection 2001, Kyoto, Japan,
3
手作業によるプログラムの編集
プログラムを編集して新しい(バージョン
の)ソフトウェアを作る
機能の追加・変更等
元の
プログラム
Sep. 25, 2001
修正後の
プログラム
The Java Technology Workshop,
Reflection 2001, Kyoto, Japan,
4
プログラム編集作業
編集作業にはルーチンワークが
頻繁に含まれる
編集のポイント
+
ルーチンワークによるコード編集
元の
プログラム
Sep. 25, 2001
修正後の
プログラム
The Java Technology Workshop,
Reflection 2001, Kyoto, Japan,
5
プログラム変換システム
ルーチンワークをコンピュータが肩代わり
編集のポイント
メタプログラム
プログラム変換
システム
元の
プログラム
Sep. 25, 2001
修正後の
プログラム
The Java Technology Workshop,
Reflection 2001, Kyoto, Japan,
6
OpenJava と Javassist は
そんなシステムです
または、構造リフレクション・システム

Java 用プログラム変換のための
ツール/フレームワーク
メタプログラム

編集のポイントを Java で記述
Sep. 25, 2001
The Java Technology Workshop,
Reflection 2001, Kyoto, Japan,
7
構造リフレクション?
構造リフレクション(structural reflection)
プログラムでプログラムの構造を扱う
 特に、クラスの構造(クラス・オブジェクトAPI)
 例:クラスにメソッドを追加

動作リフレクション(behavioral reflection)
プログラムでプログラムの動作を扱う
 例:メソッド呼び出しをトラップ

Sep. 25, 2001
The Java Technology Workshop,
Reflection 2001, Kyoto, Japan,
8
構造リフレクション・システム
OpenJava
プログラムのソーステキスト変換のための
フレームワーク

細かい構文を気にせずに、クラスの構造レベ
ルのプログラム編集を記述できる
コンパイル時構造リフレクション

文法拡張も可能
Sep. 25, 2001
The Java Technology Workshop,
Reflection 2001, Kyoto, Japan,
9
構造リフレクション・システム
Javassist
プログラムのバイトコード変換のための
ツール

バイトコードの知識がなくとも、ソーステキスト
やクラスの構造レベルのプログラム編集を記
述できる
ロード時構造リフレクション

拡張クラスローダで利用できる
Sep. 25, 2001
The Java Technology Workshop,
Reflection 2001, Kyoto, Japan,
10
OpenJava と Javassist の
構造リフレクションAPI
プログラム変換の記述が煩雑にならない
ようなAPIを目指す
コンパイラ書きたいですか?
 アセンブラ書きたいですか?

クラス・オブジェクト API
オブジェクト指向的なプログラム変換に適した
データ構造モデルを採用
 クラスの構造レベルの抽象度を備える

Sep. 25, 2001
The Java Technology Workshop,
Reflection 2001, Kyoto, Japan,
11
クラス・オブジェクト API
Java Reflection API と同様の手軽さで
プログラムの変換を
クラスクラス
標準 API java.lang.Class に相当
 OJClass – OpenJava
 CtClass – Javassist

Sep. 25, 2001
The Java Technology Workshop,
Reflection 2001, Kyoto, Japan,
12
OJClass, CtClass
標準APIと同様、クラス定義を調べるため
のメソッドを備える

getMethod(..), getField(..), getName(),
getSuperclass(), getInterfaces()
さらに加工のためのメソッドを備える

addMethod(..), addField(..), setName(..),
setSuperclass(), addInterfaces(), …
Sep. 25, 2001
The Java Technology Workshop,
Reflection 2001, Kyoto, Japan,
13
構造リフレクションを用いた
アプリケーション
動作リフレクションのベースとして
対故障性(Fault-Tolerance)を備えたプ
ラットフォーム
Design by Contract
機能分散処理
… などなど
Sep. 25, 2001
The Java Technology Workshop,
Reflection 2001, Kyoto, Japan,
14
構造リフレクションの
アプリケーション
Addistant
Sep. 25, 2001
The Java Technology Workshop,
Reflection 2001, Kyoto, Japan,
15
Addistant / Javassist
既存のプログラムを指示に従って分散化
分散方針
GUI モジュールは
あちら etc.
Addistant
Translator
元の
バイトコード
Sep. 25, 2001
分散化された
バイトコード
The Java Technology Workshop,
Reflection 2001, Kyoto, Japan,
16
シナリオ – 遠隔GUI
「クールなアプリケーション・ソフトウェアた
だしローカルで動く」
「遠隔地にあるパソコンからサーバホスト
にアクセスしてアプリを使いたい」
アプリケーション・ソフトウェアやデータの
一元一括管理
 シン・クライアント

Sep. 25, 2001
The Java Technology Workshop,
Reflection 2001, Kyoto, Japan,
17
X, VCN による遠隔GUI
Xlib ライブラリレベルで分散化

低レベルな命令が大量に
ネットワークを飛び交う
マウスが動いた
マウスボタン押された
Xlib
ユーザ
プログラム
Sep. 25, 2001
マウスボタン離された
線を書け
The Java Technology Workshop,
Reflection 2001, Kyoto, Japan,
18
Addistant による遠隔GUI
既存の Java プログラムを機能モジュール
で分割して分散化

例:Swingオブジェクトを遠隔ディスプレイホス
トで動かす
ORB
ライブラリ
ユーザ
プログラム
Sep. 25, 2001
ウィンドウ内で
クリックあり
内部ウィンドウ表示
The Java Technology Workshop,
Reflection 2001, Kyoto, Japan,
ユーザ
プログラム
19
Addistant の実装
Addistant / Javassist
バイトコードを変換して、複数のJVM上のコー
ドが相互に通信しながら動作するようにする
 バイトコード変換器と
Addistant Translator
通信ライブラリ
(ORBライブラリ)
Javassist
Addistant
からなる
ORB

Class Loader
JVM
Sep. 25, 2001
The Java Technology Workshop,
Reflection 2001, Kyoto, Japan,
20
Javassist 利用の様子(1)
プロキシ(スタブ)クラスの生成
メタプログラム
CtClass org = .. ;
CtClass proxy = new CtClass();
CtMethod[] m = org.getMethods();
for (i = 0; i < m.length; ++i)
proxy.addMethod( … m[i] );
メソッド
呼び出し
プロキシ
同じシグネチャの
メソッド追加
マスタ
ネットワーク通信
Sep. 25, 2001
The Java Technology Workshop,
Reflection 2001, Kyoto, Japan,
21
Javassist 利用の様子(2)
フィールド・アクセスのトラップ
メタプログラム
CtMethod m = … ;
CodeConverter conv = CodeConverter();
conv.replaceFieldRead( .. );
フィールドアクセスを
conv.replaceFieldWrite( .. );
スタティックメソッド
m.instrument(conv);
呼び出しに置き換え
o.x = 1;
Sep. 25, 2001
Proxy.write_x(o, 1);
The Java Technology Workshop,
Reflection 2001, Kyoto, Japan,
22
まとめ
構造リフレクション・システム
OpenJava – ソーステキスト編集
 Javassist – バイトコード編集

Javassist の利用例

Addistant – 既存プログラムの機能分散
Sep. 25, 2001
The Java Technology Workshop,
Reflection 2001, Kyoto, Japan,
23
詳細な情報は…
東工大 千葉研究室
http://www.csg.is.titech.ac.jp/
OpenJava, Javassist の公式サイト
 関係者のページ
 論文
 連絡先
など

Sep. 25, 2001
The Java Technology Workshop,
Reflection 2001, Kyoto, Japan,
24