我正在使用 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”的类型是 sun.org.mozilla.javascript.internal.NativeJavaObject ,它包装了 Java String 实例。
当我尝试从 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())
一切都很好,因为这些是 JavaScript 字符串,可以通过内部转换从 scriptContext 中获取。
我认为 NativeJavaObjects 从 scriptContext 释放时应该被解包(参见 sun.org.mozilla.javascript.internal.Wrapper.unwrap())。
那么,这是一个错误吗?我对 java7u5 有同样的问题。
我不相信我必须这样做:
var s = String(utils.getMyString())
将 Java 字符串转换为 JavaScript 字符串,以便能够将其作为 Java 字符串返回...
谢谢你的观点。