現在、当サイト「mozilla.org 日本語版」の和訳文書は更新されておらず、mozilla.org の原文 よりも内容が古くなっている可能性があります。ご不便をお掛けしますが、最新の情報は原文をご確認ください。



現在位置: Rhino プロジェクト・ページ > Java でスクリプト

Java でスクリプトする

Norris Boyd

Rhino を使って、気軽に 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 のメソッドへ呼び出しを転送します。