Rhino:如何从 Java 调用 JS 函数
Posted
技术标签:
【中文标题】Rhino:如何从 Java 调用 JS 函数【英文标题】:Rhino: How to call JS function from Java 【发布时间】:2011-04-29 02:18:03 【问题描述】:我正在使用 Mozilla Rhino 1.7r2(不是 JDK 版本),我想从 Java 调用一个 JS 函数。
我的JS函数是这样的:
function abc(x,y)
return x+y
我该怎么做?
编辑:(JS函数在一个单独的文件中)
【问题讨论】:
mozilla.org/rhino/tutorial.html#callingJSfuns @org 这个例子对我来说不是很清楚。 js文件的路径在哪里指定?我猜它假设我只需在 cmdline 中键入整个 JS 代码并将其作为 arg 传递给我的 java 应用程序! ^^" 【参考方案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,然后再为外部数组调用一次。以上是关于Rhino:如何从 Java 调用 JS 函数的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Java 程序中调用 Rhino 编译的 JavaScript 方法(类文件)?
如何使用 Rhino 将 Java 类中的方法添加为 Javascript 中的全局函数?
使用 ScriptManager (Rhino) 从 Java 中使用 Javascript HTML5 类型数组,如何?