現在位置: Rhino プロジェクト・ページ > Java でスクリプト
Java でスクリプトする
Norris BoydRhino を使って、気軽に Java でスクリプト記述することができます。 どんな Java コードも書き加える必要はありません、 ただ、既存の Rhino shell を使って Java を呼び出すだけです。
Rhino Shell
Rhino shell は、あなたのスクリプトを、ファイルあるいはコマンドラインから、 インタラクティブ (対話式)に走らせることができます。
rhino の zip ファイルをダウンロードすると、一つの JAR ファイル js.jar を含んでいるはずです。
あなたの環境のクラスパスに JAR ファイルを追加すると、次のコマンドで Rhino shell をスタートできます。
java org.mozilla.javascript.tools.shell.Main
あるいは、Java 2 (JDK 1.2 かそれ以上) があるのなら、あなたの環境の classpath は変更しなくて済み、しかも簡単に利用できます。
java -jar js.jar
あいにく、java の -jar オプションは、あなたの環境の classpath を上書きするはずです。
【訳注: 環境変数の CLASSPATH 指定が無視されるということ】
シェルのインタラクティブ (対話式)モードは、Rhino を体験してみるのに よい方法です。
以前のバージョンの Rhino では、2 つの JAR ファイル js.jar と jstools.jar を持っているため、-jar オプションをサポートしていません。 シェルをスタートするには、両方の JAR ファイルをクラスパスに追加しなければなりません。
シェル・クラスの引数に、JavaScript ファイル名を与えることで、それを実行できます …
java org.mozilla.javascript.tools.shell.Main myScript.js
シェルを使ってスクリプトを評価する (実行する)ための、いくつかのオプションがあります。 より詳しくは、コマンド解説 を参照してください。
LiveConnect: JavaScript で Java と通信
Rhino で Java をスクリプトするつもりなら、LiveConnect を使用したいはずです。 それは、Java クラスを生成し Java のメソッドを JavaScript から呼び出すことを可能にするものです。 例えばここに、対話式セッションのログがあります。 そのように入力すれば、ウィンドウと はち切れんばかりのボタンを見ることができるでしょう。

Java frame は Rhino shell から作成しました
$ java org.mozilla.javascript.tools.shell.Main
js> importPackage(java.awt);
js> frame = new Frame("JavaScript")
java.awt.Frame[frame0,0,0,0x0,invalid,hidden,layout=java.awt.BorderLayout,resizable,title=JavaScript]
js> frame.show()
js> frame.setSize(new Dimension(200,100))
js> button = new Button("OK")
java.awt.Button[button0,0,0,0x0,invalid,label=OK]
js> frame.add(button)
java.awt.Button[button0,0,0,0x0,invalid,label=OK]
js> frame.show()
js> quit()
$
java パッケージ中にない【先頭が java.
ではない】クラスを JavaScript に読み込みたいのなら、
パッケージ名の前に "Packages." を付ける必要があります。
例えば …
$ java org.mozilla.javascript.tools.shell.Main js> cx = Packages.org.mozilla.javascript.Context.currentContext org.mozilla.javascript.Context@25980b44 js> cx.evaluateString(this, "3+2", null, 0, null) 5.0 js> quit() $
JavaBean プロパティー アクセス
Java のクラスで getter と setter メソッドを使って JavaBean プロパティーを定義できます。 例えば、次のクラスは 2 つのプロパティーを定義します …
public class Me {
public int getAge() { return age; }
public void setAge(int anAge) { age = anAge;
}
public String getSex() { return "male"; }
private int age;
};
定義された 2 つのプロパティーは age (年齢)と sex (性別)です。 sex プロパティーは読み出し専用です (setter メソッドがないから)。
Rhino を使うことで、あたかも JavaScript のプロパティーのように、bean プロパティーにアクセスすることができます。 定義されたプロパティーであるメソッドも、また、呼び出すことができます。
js> me = new Packages.Me(); Me@93 js> me.getSex() male js> me.sex male js> me.age = 33; 33 js> me.age 33 js> me.getAge() 33 js>
sex プロパティーは読み出し専用なので、それに書き込むことは許されません。
JavaBean リフレクションは、Rhino 1.5 より前のバージョンでは利用できません。
Java のクラスやパッケージのインポート
上記までで、特定の Java パッケージのすべてのクラスをインポートする、importPackage 関数の使い方が分かりました。
今度は、一つのクラスをインポートするところの importClass です …
$ java org.mozilla.javascript.tools.shell.Main js> importClass(Packages.org.mozilla.javascript.Context) js> cx = Context.enter() org.mozilla.javascript.Context@25980d62 js> cx.evaluateString(this, "3+2", null, 0, null) 5.0 js> quit() $
Java クラスの拡張と Java インターフェースの実装を JavaScript に
上記の例、JavaScript を使って Java frame を作成することから始めて、(今度は)ボタンのためのリスナーを追加することができます。
一度 addActionListener を呼び出せば、ボタンをクリックすることで、現在の時刻を得て表示できるようになります …
$ java org.mozilla.javascript.tools.shell.Main
js> importPackage(java.awt);
js> frame = new Frame("JavaScript")
java.awt.Frame[frame0,0,0,0x0,invalid,hidden,layout=java.awt.BorderLayout,resizable,title=JavaScript]
js> button = new Button("OK")
java.awt.Button[button0,0,0,0x0,invalid,label=OK]
js> frame.setSize(new Dimension(200,100))
js> frame.add(button)
java.awt.Button[button0,0,0,0x0,invalid,label=OK]
js> frame.show()
js> function printDate() { print(new Date()) }
js> printDate()
Wed Mar 15 15:42:20 GMT-0800 (PST) 2000
js> o = { actionPerformed: printDate }
[object Object]
js> o.actionPerformed()
Wed Mar 15 15:42:39 GMT-0800 (PST) 2000
js> buttonListener = java.awt.event.ActionListener(o)
adapter0@6acc0f66
js> button.addActionListener(buttonListener)
js> Wed Mar 15 15:43:05 GMT-0800 (PST) 2000
Wed Mar 15 15:43:05 GMT-0800 (PST) 2000
Wed Mar 15 15:43:08 GMT-0800 (PST) 2000
quit()
$
(上記の部分で) buttonListener = java.awt.event.ActionListener(o) のようにタイプすると、
Rhino は、実際には ActionListener (のインターフェース)を実装した新しい Java クラスを生成して、そのクラスから JavaScript オブジェクトへ呼び出しを転送します。
したがって、ボタンをクリックすると、printDate メソッドが呼び出されます。
JavaScript 関数を Java メソッドへ直接指定することが、リリース 1.5R5 の Rhino から可能になります。引数が Java インターフェースと一致して、
それがただ一つのメソッドであるか、あるいは、そのメソッドの引数の数が同じで対応する引数が同じ型である場合の、どちらかであれば。
それは、printDate を直接 addActionListener へ渡すことを可能にし、(先の) 例を簡略化できます …
$ java org.mozilla.javascript.tools.shell.Main
js> importPackage(java.awt);
js> frame = new Frame("JavaScript")
java.awt.Frame[frame0,0,0,0x0,invalid,hidden,layout=java.awt.BorderLayout,title=JavaScript,resizable,normal]
js> button = new Button("OK")
java.awt.Button[button0,0,0,0x0,invalid,label=OK]
js> frame.setSize(new Dimension(200,100))
js> frame.add(button)
java.awt.Button[button0,0,0,0x0,invalid,label=OK]
js> frame.show()
js> function printDate() { print(new Date()) }
js> printDate()
Mon Oct 27 2003 10:35:44 GMT+0100 (CET)
js> button.addActionListener(printDate)
js> Mon Oct 27 2003 10:36:09 GMT+0100 (CET)
Mon Oct 27 2003 10:36:10 GMT+0100 (CET)
quit()
$
JavaAdapter コンストラクター
JavaAdapter を作成する別の方法は、明示的に JavaAdapter コンストラクターを呼び出すことです。 JavaAdapter コンストラクターの使用は、上記での Java インターフェースの「(暗示的な)コンストラクト」ではできないような、追加の機能を提供します。
このように記述する代わりに …
buttonListener = java.awt.event.ActionListener(o)
このような記述にもできます
buttonListener = new JavaAdapter(java.awt.event.ActionListener, o)
どちらも同じです。そしてその上、Foo クラスの拡張と、
さらに java.lang.Runnable の実装をするのなら、次のように記述するはずです。
buttonListener = new JavaAdapter(Packages.Foo,
java.awt.event.ActionListener,
java.lang.Runnable, o)
その構文の概要は …
new JavaAdapter(java-class, [java-class,...] javascript-object)
最大でも一つの java-class が Java クラスで、残りの (複数の) java-class はインターフェースです。
結果として Java アダプターを返すはずで、それは、指定された Java クラスを拡張し、Java インターフェースを実装し、
そして javascript-object のメソッドへ呼び出しを転送します。