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