【问题标题】:Rhino: How to call JS function from JavaRhino:如何从 Java 调用 JS 函数
【发布时间】:2011-04-29 02:18:03
【问题描述】:

我正在使用 Mozilla Rhino 1.7r2(不是 JDK 版本),我想从 Java 调用一个 JS 函数。

我的JS函数是这样的:

function abc(x,y)
{
  return x+y
}

我该怎么做?

编辑:(JS函数在一个单独的文件中)

【问题讨论】:

  • @org 这个例子对我来说不是很清楚。 js文件的路径在哪里指定?我猜它假设我只需在 cmdline 中键入整个 JS 代码并将其作为 arg 传递给我的 java 应用程序! ^^"

标签: java javascript rhino


【解决方案1】:
String script = "function abc(x,y) {return x+y;}";
Context context = Context.enter();
try {
    ScriptableObject scope = context.initStandardObjects();
    Scriptable that = context.newObject(scope);
    Function fct = context.compileFunction(scope, script, "script", 1, null);
    Object result = fct.call(
            context, scope, that, new Object[] {2, 3});
    System.out.println(Context.jsToJava(result, int.class));
} finally {
    Context.exit();
}

更新:当函数与其他函数和变量一起加载到作用域中时

String script = "function abc(x,y) {return x+y;}"
        + "function def(u,v) {return u-v;}";
Context context = Context.enter();
try {
    ScriptableObject scope = context.initStandardObjects();
    context.evaluateString(scope, script, "script", 1, null);
    Function fct = (Function)scope.get("abc", scope);
    Object result = fct.call(
            context, scope, scope, new Object[] {2, 3});
    System.out.println(Context.jsToJava(result, int.class));
} finally {
    Context.exit();
}

【讨论】:

  • 在尝试阻止 context.setOptimizationLevel(-1); 之前不要忘记添加这个;
  • @Maurice Perry 如果我想使用 [[1,3],[4,5],[6,9]] 等多维整数数组调用函数,那么我该如何传递 Object[] ?
  • @SamirMangroliya 我猜你需要为每个内部数组调用 Context.newArray,然后再为外部数组调用一次。
猜你喜欢
  • 1970-01-01
  • 2023-03-06
  • 1970-01-01
  • 2017-03-06
  • 2011-09-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多