Java 言語におけるオブジェクトのメソッド呼出し記述を解析して、 オブジェクトを生成し返す JavaBeans コンポーネントです。 記述可能な要素は、 new, インスタンスメソッド呼出し, クラスメソッド呼出し, 「""」で囲まれた文字列の定数表現, 整数の定数表現, this です。
利便性を考慮して、 直前の文の評価時に生成したオブジェクトを 「this」キーワードを用いて以降でも再度用いることができます。 連続した複数のメソッド呼出しの結果を確認可能なことを意味します。
また、文字列の定数表現を可能としているため、
本当は、整数の定数表現をサポートする必要はありません。
プリミティブ型は、例えば
new Integer("100").intValue()
のように、必ずオブジェクト型とメソッド呼出しを組合わせて
表現可能だからです。
しかし、
整数は使用頻度が高い(と勝手に思っている)ため、
特別にサポートしています。
#一貫性を欠いていることを自覚しています :-)
StatementBean は、 コンソール上で単体のアプリケーションとしても動作します。 用いる為の準備は以下の通りです。
set CLASSPATH=.:%CLASSPATH%:/(置いた場所)/statementbean.jar
または java -cp /(置いた場所)/statementbean.jar (クラス名)
new net.washizaki.statement.StatementBean(); として
オブジェクトを生成します。
または、import net.washizaki.statement.StatementBean; としておく方が
記述量が減って楽です :-)
evaluate(String statement) メソッドの実行によって、
文を渡して即実行できます。
評価結果は Object として返ってきます。
しかし、せっかく JavaBeans コンポーネントなんですから、
setStatement(String statement) メソッドによって
statementプロパティに値をセットし、
その後、
invoke() メソッドによって同様に実行することもできます。
以下の例では、既に上記の 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
せっかく JavaBeans コンポーネントなんですから、 ここはひとつ、開発ツール上でビジュアルに使ってみましょう。 以下の例では、開発ツールとして BeanBox (BDK: JavaBeans Development Kit) を利用します。
手順:
すると、以下のような入力を促すウィンドウが表示されます。
プロパティ:
| プロパティ名 | 型 | 初期値 | 概要 |
| statement | java.lang.String | "" | 評価する Java の文です。 |
| cached | boolean | false | 値が true のときは、
evaluateメソッド・invokeメソッドによる評価時に 新たな文の評価を行わず、過去に評価した際のオブジェクトを返します。 |
メソッド:
| メソッド名 | 構造 | 概要 |
| FukaGraphBean | FukaGraphBean( ) | デフォルトコンス トラクタです。 |
| evaluate | Object evaluate( String statement ) |
引数で与える文を評価・実行し、実行結果をオブジェクトと して返します。 |
| invoke | void invoke( ) | statementプロパティの値を評価し実行します。 |
| setStatement | void setStatement( String statement ) | statementプロパティの値を設定します。 |
| getStatement | String getStatement( ) | statementプロパティの値を返します。 |
| setCached | void setCached( boolean cached ) | cachedプロパティの値を設定します。 |
| isCached | boolean isCached( ) | cachedプロパティの値を返します。 |
イベント: (無し)