0

我正在使用 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 字符串返回...

谢谢你的观点。

4

1 回答 1

1

问题似乎类似于:https ://stackoverflow.com/questions/11814010/javascript-rhino-java-float-method-returns-number-or-object 和 Rhino Javascript:如何将 Object 转换为 Javascript 原语?

但在你的情况下,我相信:

Context.enter().getWrapFactory().setJavaPrimitiveWrap(false); 

将抛出 NullPointerException。您使用 JDK javax.script 中的 Rhino,而 ScriptEngine.eval 方法包装了所有处理上下文(进入、退出上下文等)的操作,因此如果您在 eval 之前调用上述代码,可能无法初始化 rhino 上下文(进入方法将上下文分配给当前线程)。

解决方案可能是直接从org.mozilla中使用Rhino并直接处理上下文: 在进入上下文时链接并调用上面的代码。

当我使用 JDKs ScriptEngine 并使用 Rhino 形式的 mozilla 解决它时,我遇到了类似的问题(以及其他问题)。

于 2012-09-06T23:01:14.957 回答