我正在使用带有Rhino的javax.scripting 在这个项目中。
我有一个返回Java对象的Java方法(Double,Long, 整数等)。我想从javascript调用该方法 将结果引用为Javascript基元类型。然而, javacript将返回类型识别为Object。
如何强制它转换为javascript原语?
问题在于如何获取对上下文的引用 WrapFactory?
示例代码:
public class data
{
Double value = 1.0d;
public Number get() { return value; }
}
public static void main(String[] args)
{
ScriptEngine engine = new ScriptEngineManager().getEngineByName ("rhino");
data data = new data();
try
{
engine.eval("function test(data) { return data.getD('value1') + 5;};");
System.out.println("Result:" + ((Invocable)engine).invokeFunction("test", data));
}
catch (Exception e)
{
e.printStackTrace();
}
}
输出: 结果:15
答案 0 :(得分:3)
尝试以下
public static void main(String [] args) throws Exception {
ScriptEngine engine = new ScriptEngineManager().getEngineByName ("rhino");
data data = new data();
Context.enter().getWrapFactory().setJavaPrimitiveWrap(false);
try
{
engine.eval("function test(data) { return data.get('value1') + 5;};");
System.out.println("Result:" + ((Invocable)engine).invokeFunction("test", data));
}
catch (Exception e)
{
e.printStackTrace();
}
}
public static class data
{
Double value = 1.0d;
public Number get(String arg) { return value; }
}
或者,您可以修改javascript函数以将值显式转换为数字:
function test(data) { return parseInt(data.get('value1'), 10) + 5;}
答案 1 :(得分:0)
在JavaScript代码中使用以下内容作为输出:
function aFunction(data)
{
return parseInt(data);
}
答案 2 :(得分:0)
我开发了这个应用程序,您可以在其中输入一组数学公式,这些公式将由Java 6中内置的JavaScript引擎进行评估,我认为这是一个犀牛的端口。我们的想法是,我们将拥有一组地图,这些地图将包含变量,例如:
MAP["VALUE 1"]
MAP["VALUE 2"]
我使用了这种方法,因为公式的一些表达式来自我控制下的变量,可能是无效的JS标识符。我的第一种方法是声明一个地图并将其添加到JS引擎中,但它失败的方式与它失败的方式相同 - 它将其解释为字符串,而不是数字。
解决方案是解析公式,找出它使用的变量,然后在JS引擎中声明对象。
这样的事情:
var MAP = new Object();
MAP["VALUE 1"] = 1;
MAP["VALUE 2"] = 2;
然后MAP["VALUE 1"] + MAP["VALUE 2"]
将返回3
,而不是12
。
可能有一个更好的解决方案,但是一旦你进行初始编码/解析,上面的内容将始终有效。在我们的例子中,我们执行“声明性”语句,以及执行公式的另一个阶段。 JS引擎非常快,所以对我们来说这不是问题。