StatementBean

作成: November 7, 2001
鷲崎 弘宜 washi@fuka.info.waseda.ac.jp
http://www.washizaki.net

戻る(FukaBeans)

配布

StatementBean とは?

Java 言語におけるオブジェクトのメソッド呼出し記述を解析して、 オブジェクトを生成し返す JavaBeans コンポーネントです。 記述可能な要素は、 new, インスタンスメソッド呼出し, クラスメソッド呼出し, 「""」で囲まれた文字列の定数表現, 整数の定数表現, this です。

利便性を考慮して、 直前の文の評価時に生成したオブジェクトを 「this」キーワードを用いて以降でも再度用いることができます。 連続した複数のメソッド呼出しの結果を確認可能なことを意味します。

また、文字列の定数表現を可能としているため、 本当は、整数の定数表現をサポートする必要はありません。 プリミティブ型は、例えば new Integer("100").intValue() のように、必ずオブジェクト型とメソッド呼出しを組合わせて 表現可能だからです。 しかし、 整数は使用頻度が高い(と勝手に思っている)ため、 特別にサポートしています。
#一貫性を欠いていることを自覚しています :-)

StatementBean は、 コンソール上で単体のアプリケーションとしても動作します。 用いる為の準備は以下の通りです。

  1. クラスパスを通す

    set CLASSPATH=.:%CLASSPATH%:/(置いた場所)/statementbean.jar
    または java -cp /(置いた場所)/statementbean.jar (クラス名)

  2. プログラム中で宣言する。

    new net.washizaki.statement.StatementBean(); として オブジェクトを生成します。
    または、import net.washizaki.statement.StatementBean; としておく方が 記述量が減って楽です :-)

  3. 文を代入し実行する。

    evaluate(String statement) メソッドの実行によって、 文を渡して即実行できます。 評価結果は Object として返ってきます。
    しかし、せっかく JavaBeans コンポーネントなんですから、 setStatement(String statement) メソッドによって statementプロパティに値をセットし、 その後、 invoke() メソッドによって同様に実行することもできます。

利用例

Java プログラム中で用いる

以下の例では、既に上記の import 文を事前に記述してあるものとします。 または、記述中の全ての StatementBean を net.washizaki.statement.StatementBean に置換えても構いません。 文中では、最後に必ず 「;」 が必要です。

例 1: プログラム中に静的に文を記述してもあまり意味がありません。 むしろ以下のように、実行時にユーザに任意の文を入力させて、 あるいは実行時に決定される Java の文を解釈することに意味があります。

java.awt.TextField field = new java.awt.TextField();
StatementBean bean = new StatementBean();

(field にユーザが文を記述)

bean.evaluate(field.getText());

例 2: プロパティ statement に文を代入した後で evaluate メソッドを呼ぶことで対象文を評価した後のオブジェクトを得ます。

StatementBean bean = null;
bean = new StatementBean();
bean.setStatement( "new java.lang.String(\"HOGE\").toLowerCase();" );
System.out.println( "result:" + bean.evaluate()); // result: hoge
bean.setStatement( "this.toUpperCase();" );
System.out.println( "result:" + bean.evaluate()); // result: HOGE

例 3: 直接 evaluate(statement) することも可能です。 以下の 3 つは全て Frame を表示するという同一の処理を行います。

new StatementBean().evaluate("new java.awt.Frame().show();");
new StatementBean().evaluate(
	"java.lang.Class.forName(\"java.awt.Frame\").newInstance().show();"
);
new StatementBean().evaluate(
	"java.lang.Class.forName(" + 
	"new java.lang.String(\"java.awt.Frame\")).newInstance().show();"
);

アプリケーションとして用いる

単独のアプリケーションとしてコンソール上で動作させることも できます。ごく単純なオブジェクトテストに使えるかも知れません。 「quit」と打つと終了します。 以下の例では、 フレームを生成して表示し、 サイズを変更しています。

% java -cp statementbean.jar net.washizaki.statement.StatementBean
> java.lang.Class.forName("java.awt.Frame").newInstance();
value: java.awt.Frame[...]
> this.setVisible(new java.lang.Boolean("true").booleanValue());
value: null
> this.setSize(200,300);
value: null
> quit

BeanBox 等の JavaBeans 対応開発ツール上で用いる

せっかく JavaBeans コンポーネントなんですから、 ここはひとつ、開発ツール上でビジュアルに使ってみましょう。 以下の例では、開発ツールとして BeanBox (BDK: JavaBeans Development Kit) を利用します。

手順:

  1. まず、BDK の jars ディレクトリに statementbean.jar をコピーします。 また、文の代入用フィールドとして FukaTextBean を使うので FukaTextBean.jar も同じ場所にコピーします。 (bdk/jars)
  2. BeanBox を起動します。(bdk/beanbox/run.sh)
  3. StatementBean と FukaTextBean 、それに ボタンとして ExplicitButton を設計ウィンドウ上に置きます。
  4. StatementBean の 「statementプロパティ」と FukaTextBean の「textプロパティ」を バインドします。(Menu -> Edit -> Bind Property)
  5. ExplicitButton の アクションイベント発火時に StatementBean の「invokeメソッド」を呼び出すように結び付けます。 (Menu -> Edit -> Events -> button push -> action performed, StatementBean の invoke を選択)
  6. FukaTextBean に適当な文を入力して ExplicitButton を押すと、 文が評価・実行されます。 例えば 「javax.swing.JOptionPane.showInputDialog (new java.lang.Object());」 と入力します。

    すると、以下のような入力を促すウィンドウが表示されます。

コンポーネント仕様

プロパティ:

プロパティ名初期値概要
statementjava.lang.String""評価する Java の文です。
cachedbooleanfalse値が true のときは、 evaluateメソッド・invokeメソッドによる評価時に
新たな文の評価を行わず、過去に評価した際のオブジェクトを返します。

メソッド:

メソッド名構造概要
FukaGraphBeanFukaGraphBean( )デフォルトコンス トラクタです。
evaluateObject evaluate( String statement ) 引数で与える文を評価・実行し、実行結果をオブジェクトと
して返します。
invokevoid invoke( ) statementプロパティの値を評価し実行します。
setStatementvoid setStatement( String statement ) statementプロパティの値を設定します。
getStatementString getStatement( ) statementプロパティの値を返します。
setCachedvoid setCached( boolean cached ) cachedプロパティの値を設定します。
isCachedboolean isCached( ) cachedプロパティの値を返します。

イベント: (無し)


戻る(FukaBeans)