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

标签 java javascript compiler-construction embed rhino

我将以下 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文档:

-implements java-intf-name

Specifies that a java class implementing the Java interface java-intf-name should be generated from the incoming JavaScript source file. Each global function in the source file is made a method of the generated class, implementing any methods in the interface by the same name.

定义这个接口(interface):

//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。为了简洁起见,我避免使用包等。

关于java - 如何在Java程序中调用Rhino编译的JavaScript方法(类文件)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5055855/

相关文章:

java - 如何正则表达式不包含空格的单词?

JavaFX - 无法加载项目目录内的图像

java - 在android中解析带有字符和数字的字符串

java - display.async 和平滑过渡

javascript - 我希望使用 tablesorter 在加载时按特定顺序对表进行排序

objective-c - iOS:当我将 AppDelegate.h 包含到另一个头文件中时,什么会导致 Xcode 编译器抛出错误?

c++ - Visual Studio 2010 C++ 编译器 - 编译时获取当前行号

c++ - 用G++编译时出现如下错误

javascript 到 jquery

javascript - 事件未使用函数绑定(bind)定义