jrunscript

jrunscript

今更ながらjavaの組み込みjavascriptを試す。

javaのクラス(パッケージは)簡単に呼び出せる。

java標準のクラスは、特に気にすること無く、普通に呼び出せる。

1
2
java.lang.System.out.println('test message');
java.swing.JOptionPane.showMessageDialog(null, 'Test Message');

Java標準以外のクラスは、Packagesから始めて呼び出す必要がある。

1
2
var log = Packages.org.apache.commons.logging.LogFactory.getLog('my-script.js');
log.info('message');

上の例では、commons-loggingを利用しているので、jrunscript引数の-cpまたは-classpathで、commons-logging.jarとロガーを指定する必要がある。
クラスパスの指定で、jarを*でディレクトリごと指定することはできない。個別に.jarを羅列する。

Java標準クラスをPackagesから辿ることもできる。

1
2
java.lang.String.format('Test. %04.3f', 12.3);
Packages.java.lang.String.format('Test. %04.0f', 13);

なお、Javaでは何もしなくてもインポートされているjava.langは、jrunscriptではインポートされていない。
Object,Boolean,Stringなどがjavascriptとjavaで当たってしまうためらしい。

jrunscriptでもimportを行えば、クラス名だけでクラスを指定することができる。

1
2
importClass(java.util.ArrayList);
importPackage(javax.swing);

クラス毎のimportと、パッケージ単位のimportができる。
このimport方法だとスクリプト内のすべてで有効になってしまうため、不都合があるかもしれない。
そんなときは、JavaImporterを利用することで、狭い範囲のインポート宣言を行える。

1
2
3
4
5
6
7
var mylib = new JavaImporter(
    java.lang,
    javax.swing
);
with (mylib) {
    JOptionPane.showMessageDialog(null, String.format('Test. %s', 'NN'));
}

度々、String.formatのサンプルで書いているが、javascriptの数値はjavaのDoubleとして変換される。
したがって、String.formatでjavascriptの数値を変換するときはfを利用する。

jrunscriptでは、外部のjavascriptファイルを簡単に呼び出すことができる。

1
load('myCommon.js');

面倒な処理があるばあいは、共通処理として出しておければ良いと思う。
内部処理的には、ファイルを開いてevalしているらしい。

注意すべきところ

javaのメソッドを呼び出して返ってきたStringはあくまでもjava.lang.String。
したがって、javascriptの文字列との比較でアンマッチになることがある。
if (a == b) は、問題なく比較できる。
Arrayにpushし、indexOfで存在確認すると、アンマッチになった。

まとめ

結構、普通に使えた。
ただ、Java7に付属するRhinoでは、javaのリストのイテレートがが面倒。
Java8からのNashornになると、イテレートがfor inでできるようになるので使い易いと思う。

Javaクラスを呼び出せばなんでもできてしまうが、javascriptそのものが非力なため、ファイルの一覧を処理するような場合は、jythonを使ったほうがずっと手軽にできた。

ただ、まったく新しい言語を覚えなくても、公用語とも言えるjavascriptでjavaのAPIを自由に使えるのはとても良いと思った。

同じタグの記事
同じカテゴリの記事

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA