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