Rhino で JavaScript の予約語と同じ名前をもつメソッドを呼び出す方法
Rhino の jrunscript で File#delete() が動かなかった時のメモ *1
起きたこと
File#delete() メソッドを呼ぶとエラーになる。delete は JavaScript の予約語だからダメってことらしい → https://bugzilla.mozilla.org/show_bug.cgi?id=229895
> jrunscript js> new java.io.File('C:\\Users\\shrimp\\hoge.txt').delete(); script error: sun.org.mozilla.javascript.internal.EvaluatorException: missing name after . operator (<STDIN>#1) in <STDIN> at line number 1
JavaScript の予約語ということで typeof を試したけどダメ。他の予約語もダメ。
package hoge; public class JSRW { public void hoge() { System.out.println("hoge"); } public void typeof() { System.out.println("typeof"); } }
$ jrunscript -q Language ECMAScript 1.6 implemention "Mozilla Rhino" 1.6 release 2 $ jrunscript -cp . js> var jsrw = new Packages.hoge.JSRW(); js> jsrw.hoge(); hoge js> jsrw.typeof(); script error: sun.org.mozilla.javascript.internal.EvaluatorException: missing name after . operator (<STDIN>#1) in <STDIN> at line number 1
解決策
ブラケット表記なら OK.
> jrunscript
js> new java.io.File('C:\\Users\\shrimp\\hoge.txt')['delete']();
true
少し気になったこと
https://bugzilla.mozilla.org/show_bug.cgi?id=229895 では「1.5R5 で直るよー」みたいに書かれてるけど、1.6 でも直ってない?
> C:\Program Files\Java\jdk1.6.0_45\bin\jrunscript.exe -q Language ECMAScript 1.6 implemention "Mozilla Rhino" 1.6 release 2
Nashorn はちゃんと動く
> C:\Program Files\Java\jdk1.8.0_77\bin\jrunscript.exe -q Language ECMAScript ECMA - 262 Edition 5.1 implementation "Oracle Nashorn" 1.8.0_77 > C:\Program Files\Java\jdk1.8.0_77\bin\jrunscript.exe nashorn> new java.io.File('C:\\Users\\shrimp\\hoge.txt').delete(); true
*1:Ant で allbutlast リソースコレクションを使いたかったのだけどバージョンが古くてが使えず、taskdef タスクで JavaScript 書いたのが元ネタ