読者です 読者をやめる 読者になる 読者になる

Rhino で JavaScript の予約語と同じ名前をもつメソッドを呼び出す方法

Rhino Java

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

結論

来年には Java 9 がリリースされるという2016年、Java 6 なんて環境はあまりないだろうから実質無問題(^^)

*1:Ant で allbutlast リソースコレクションを使いたかったのだけどバージョンが古くてが使えず、taskdef タスクで JavaScript 書いたのが元ネタ