我正在使用java 6 javax.script功能,但我遇到了一个问题:
在调用ScriptEngine.eval()方法之前,我将一些属性添加到ScriptContext:
scriptContext.setAttribute("Utils", utils, ScriptContext.ENGINE_SCOPE);
在脚本中我打电话:
var s = utils.getMyString()
Java getMyString()方法返回一个String(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())
一切都很好,因为这些是javascript字符串,可以通过内部转换从scriptContext获取。
我认为NativeJavaObjects应该从scriptContext中释放出来(见sun.org.mozilla.javascript.internal.Wrapper.unwrap())。
那么,这是一个错误吗?我对java7u5也有同样的问题。
我不相信我必须这样做:
var s = String(utils.getMyString())
将Java字符串转换为JavaScript字符串,以便能够将其作为Java字符串... ...
感谢您的观点。
答案 0 :(得分:1)
问题似乎与:https://stackoverflow.com/questions/11814010/javascript-rhino-java-float-method-returns-number-or-object类似 和 Rhino Javascript: How to convert Object to a Javascript primitive?
但在你的情况下,我相信:
Context.enter().getWrapFactory().setJavaPrimitiveWrap(false);
将抛出NullPointerException。 您使用JDK javax.script中的Rhino,ScriptEngine.eval方法包含处理上下文(输入,退出上下文等)的所有操作,因此如果您在eval之前调用上述代码,则可能无法初始化rhino上下文(输入方法分配上下文)当前线程)。
解决方案可能是直接使用Rhino形成org.mozilla并直接处理上下文:link 并在输入上下文时调用上面的代码。
当我使用JDKs ScriptEngine并使用Rhino形式的mozilla解决它时,我遇到了类似的问题(以及其他问题)。