jrunscript
今更ながらjavaの組み込みjavascriptを試す。
javaのクラス(パッケージは)簡単に呼び出せる。
java標準のクラスは、特に気にすること無く、普通に呼び出せる。
java.lang.System.out.println('test message');
java.swing.JOptionPane.showMessageDialog(null, 'Test Message');
Java標準以外のクラスは、Packagesから始めて呼び出す必要がある。
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から辿ることもできる。
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を行えば、クラス名だけでクラスを指定することができる。
importClass(java.util.ArrayList);
importPackage(javax.swing);
クラス毎のimportと、パッケージ単位のimportができる。
このimport方法だとスクリプト内のすべてで有効になってしまうため、不都合があるかもしれない。
そんなときは、JavaImporterを利用することで、狭い範囲のインポート宣言を行える。
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ファイルを簡単に呼び出すことができる。
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を自由に使えるのはとても良いと思った。
- html data-* 属性
- javascriptの配列操作
- jjs
- jQueryで部分一致検索
- jqueryのバージョンとprop()
- Template Engine Mustache を使う
- Vue Routerを使ったサイトで404が発生
- vue.jsでテンプレートが一瞬表示されてしまう
コメントを残す