Java 6 javax.script 機能を使用していますが、問題があります:
ScriptEngine.eval() メソッドを呼び出す前に、いくつかの属性を ScriptContext に設定します。
scriptContext.setAttribute("Utils", utils, ScriptContext.ENGINE_SCOPE);
私が呼び出すスクリプトで:
var s = utils.getMyString()
Java getMyString() メソッドは文字列 (java.lang.String) を返します。
scriptContext の「s」の型は、Java String インスタンスをラップする sun.org.mozilla.javascript.internal.NativeJavaObject です。
Java でコンテキストから属性を取得しようとすると、次のようになります。
(String) scriptContext.getAttribute("s");
私は得た
java.lang.ClassCastException:
sun.org.mozilla.javascript.internal.NativeJavaObject cannot be cast to java.lang.String
スクリプトに書くと:
var s = "hello world"
また
var s = "" + utils.getMyString()
また
var s = String(utils.getMyString())
これらは、内部変換のおかげで scriptContext から取得できる JavaScript 文字列であるため、すべて問題ありません。
scriptContext から解放されるとき、NativeJavaObjects はアンラップされるべきだと思います (sun.org.mozilla.javascript.internal.Wrapper.unwrap() を参照)。
それで、それはバグですか?java7u5でも同じ問題があります。
私はしなければならないだろうとは信じていません:
var s = String(utils.getMyString())
Java文字列をJavaScript文字列に変換して、Java文字列として戻すことができます...
ご意見ありがとうございます。