先週までは、Javaからスクリプトをどう扱うかを紹介してきました。

今週はいままでと異なり、スクリプトからJavaにアクセスしてみましょう。スクリプトからの視点なので、スクリプト言語によって書き方は異なります。ここでは、標準で使用できるJavaScript (Rhino)を使用します。

スクリプトの評価には第59回で使用したScriptSample5クラスから名前を変更したScriptEvaluatorクラスを使用しました。

サンプルのソース ScriptEvaluator.java

 

Javaオブジェクトの生成

はじめは、スクリプトの中でJavaオブジェクトを生成してみましょう。

Rhinoでは、Javaオブジェクトを生成するのに、Javaと同様にnewを使用して行ないます。ただし、Javaのクラスを使う前にはJavaのクラスをインポートしておく必要があります。

たとえば、現在時刻を表示してみます。

importPackage(java.util);
 
var cal = new GregorianCalendar();
println(cal);

Javaのクラスをインポートするには赤字で示したようにimportPackage、もしくはimportClassを使用します。importPackageはパッケージ単位でのインポート、importClassはクラス単位でのインポートです。

したがって、上記のスクリプトはimportClassを使えば、以下のようにも記述できます。

importClass(java.util.GregorianCalendar);
 
var cal = new GregorianCalendar();
println(cal);

オブジェクトの生成は上述したように、newで行ないます。

では、このスクリプトを実行してみましょう。

C:\scripting>java ScriptEvaluator time.js
java.util.GregorianCalendar[time=1201426632234,areFieldsSet=true,areA
llFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id="Asi
a/Tokyo",offset=32400000,dstSavings=0,useDaylight=false,transitions=1
0,lastRule=null],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=1,YEAR
=2008,MONTH=0,WEEK_OF_YEAR=5,WEEK_OF_MONTH=5,DAY_OF_MONTH=27,DAY_OF_Y
EAR=27,DAY_OF_WEEK=1,DAY_OF_WEEK_IN_MONTH=4,AM_PM=1,HOUR=6,HOUR_OF_DA
Y=18,MINUTE=37,SECOND=12,MILLISECOND=234,ZONE_OFFSET=32400000,DST_OFF
SET=0]

JavaのGregorianCalendarオブジェクトが正しく生成できたようです。

オブジェクトが生成できれば、メソッドコールも普通に行なうことができます。

importClass(java.util.GregorianCalendar);
 
var cal = new GregorianCalendar();
println(cal.getTime());

赤字で示したようにGregorianCalendarクラスのgetTimeメソッドをコールしてみました。

C:\scripting>java ScriptEvaluator time.js
Sun Jan 27 18:39:33 JST 2008

staticなフィールドやメソッドもJavaと同じように記述することができます。下の例はJavaScriptのprintではなく、Javaから出力しています。

importClass(java.lang.System);
importClass(java.util.GregorianCalendar);
  
var cal = new GregorianCalendar();
System.out.println(cal.getTime());

ここで注意すべきなのは、java.langパッケージであっても、インポートする必要があるということです。

では、このスクリプトを実行してみましょう。

C:\scripting>java ScriptEvaluator time.js
Sun Jan 27 18:40:34 JST 2008

ところで、ここでなぜわざわざGregorialCalendarクラスを使用しているのかといえば、importClassでjava.util.Dateクラスが指定できないからです。

というのも、DateはJavaScriptで定義されているオブジェクトであるためです。

このような場合、Packagesオブジェクトを使用してクラスを指定します。

var date = new Packages.java.util.Date(); 
 
println(date);

これを実行してみましょう。

C:\scripting>java ScriptEvaluator date.js
Sun Jan 27 18:55:42 JST 2008

自作のクラスの場合も、Packagesオブジェクトを使用してクラスを指定します。たとえば、以下に示したようなsample.Helloクラスがあったとします。

package sample;
 
public class Hello {
    public String sayHello(String name) {
        return "Hello, " + name + "!";
    }
}

このHelloクラスをスクリプトからコールしてみます。

var hello = new Packages.sample.Hello();
println(hello.sayHello('World'));

JavaScriptの文字列とJavaの文字列は異なりますが、Rhinoスクリプトエンジンが自動的に変換します。数値なども同様に自動的に変換します。また、配列も自動変換されます。

さて、このスクリプトを実行してみましょう。もちろん、Helloクラスをクラスパスに含むようにして、実行してください。

C:\scripting>java ScriptEvaluator hello.js
Hello, World!

javaやjavaxではじまるパッケージはPackagesを省略して書くことが可能です。この他にもorg、edu、com、netではじまるパッケージも同様にPackagesを省略することが可能です。