先週までは、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を省略することが可能です。

この先は会員の登録が必要です。有料会員(月額プラン)は初月無料!

日経 xTECHには有料記事(有料会員向けまたは定期購読者向け)、無料記事(登録会員向け)、フリー記事(誰でも閲覧可能)があります。有料記事でも、登録会員向け配信期間は登録会員への登録が必要な場合があります。有料会員と登録会員に関するFAQはこちら