如何在Java程序中调用Rhino编译的JavaScript方法(类文件)?

我将以下JavaScript文件“test.js”编译成“test.class”:

var test = (function () { var that = {}; that.addNumbers = function (a, b) { return a+b; }; return that; }()); 

我想在简单的Java程序“run.java”中调用已编译的JavaScript函数“test.addNumbers(1,2)”,如下所示:

 public class run { public static void main(String[] args) throws Exception { Context cx = Context.enter(); try { Scriptable scope = cx.initStandardObjects(); // HOW TO CALL THE METHOD, Test.addNumbers(1,2)? Please help me! } finally { Context.exit(); } } } 

我尝试了很多方法,但都失败了。 我阅读了Rhino教程并检查了许多文章和示例,但他们只展示了如何从命令行或源文件“test.js”调用JavaScript方法。 我需要从编译的“test.class”文件中调用该方法。

非常感谢您的帮助!

使用javap ,我相信JavaScript类型test并不意味着生成的Java类型就是这个类。 生成的Java类型在其构造函数中调用脚本代码; 这不会导致将addNumbers暴露为Java方法。

 >javap -classpath . test public class test extends org.mozilla.javascript.NativeFunction implements org.m ozilla.javascript.Script{ public test(org.mozilla.javascript.Scriptable, org.mozilla.javascript.Contex t, int); public test(); public static void main(java.lang.String[]); public final java.lang.Object exec(org.mozilla.javascript.Context, org.mozil la.javascript.Scriptable); public final java.lang.Object call(org.mozilla.javascript.Context, org.mozil la.javascript.Scriptable, org.mozilla.javascript.Scriptable, java.lang.Object[]) ; public int getLanguageVersion(); public java.lang.String getFunctionName(); public int getParamCount(); public int getParamAndVarCount(); public java.lang.String getParamOrVarName(int); public java.lang.String getEncodedSource(); public boolean getParamOrVarConst(int); } 

在行之间阅读,我会说你需要映射到Java类型来做你想要的。 来自jsc doc:

-implements java-intf-name

指定应从传入的JavaScript源文件生成实现Java接口java-intf-name的java类。 源文件中的每个全局函数都是生成的类的方法,通过相同的名称实现接口中的任何方法。

定义此界面:

 //Adder.java public interface Adder { public int addNumbers(int a, int b); } 

写下这个实现:

 //AdderImpl.js function addNumbers(a, b) { return a+b; } 

使用参数-implements Adder AdderImpl.js编译JavaScript。 像这样调用方法:

 Adder adder = new AdderImpl(); int n = adder.addNumbers(1, 2); System.out.println(n); 

我猜测由于语言类型系统的不同,可能有必要这样做。

我用过Rhino 1.7R2。 为了简洁起见,我避免使用包等。