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を自由に使えるのはとても良いと思った。
- html data-* 属性
- javascriptの配列操作
- jjs
- jQueryで部分一致検索
- jqueryのバージョンとprop()
- Template Engine Mustache を使う
- Vue Routerを使ったサイトで404が発生
- vue.jsでテンプレートが一瞬表示されてしまう