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

如何在Java程序中调用Rhino编译的JavaScript方法(类文件)?,java,javascript,compiler-construction,embed,rhino,Java,Javascript,Compiler Construction,Embed,Rhino,我将以下JavaScript文件“test.js”编译到“test.class”中: 我想在简单的Java程序“run.Java”中调用编译后的JavaScript函数“test.addNumbers(1,2)”,如下所示: public class run { public static void main(String[] args) throws Exception { Context cx = Context.enter(); try { Scrip

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

我想在简单的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”文件中调用该方法

非常感谢您的帮助

使用,我相信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类型来做你想做的事情。从文档:

-实现java intf名称

指定一个java类 实现Java接口 应生成
java intf name
来自传入的JavaScript源 文件中的每个全局函数 源文件是由 生成的类,实现任何 方法在接口中由相同的 名字

定义此接口:

//Adder.java
public interface Adder {
  public int addNumbers(int a, int b);
}
编写以下实现:

//AdderImpl.js
function addNumbers(a, b) {
  return a+b;
}
使用参数编译JavaScript
-实现加法器AdderImpl.js
。按如下方式调用该方法:

Adder adder = new AdderImpl();
int n = adder.addNumbers(1, 2);
System.out.println(n);
我冒昧地猜测,由于语言类型系统的差异,可能有必要这样做


我用的是Rhino 1.7R2。为简洁起见,我避免使用软件包等。

非常感谢您的帮助,它很有效!我不需要担心准备上下文内容,而是在实现类上“新建”并只使用接口方法。好极了现在,如果要将类关闭器添加到最终编译的代码中,该怎么办。
Adder adder = new AdderImpl();
int n = adder.addNumbers(1, 2);
System.out.println(n);