【问题标题】:How to invoke Rhino compiled JavaScript methods (class files) in the Java program?如何在 Java 程序中调用 Rhino 编译的 JavaScript 方法(类文件)?
【发布时间】:2011-06-30 15:54:28
【问题描述】:

我将以下 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”文件中调用该方法。

非常感谢您的帮助!

【问题讨论】:

    标签: java javascript compiler-construction embed rhino


    【解决方案1】:

    使用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

    指定一个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;
    }
    

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

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

    我大胆猜测,由于语言类型系统的差异,可能有必要这样做。

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

    【讨论】:

    • 非常感谢您的帮助,它有效!我不需要担心准备上下文的东西,而是在实现类上“新建”并且只使用接口方法。太棒了!
    • 现在,如果你想在最终编译的代码中添加类快门怎么办。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-20
    • 2014-11-13
    • 2014-06-13
    • 2010-11-18
    • 2013-01-26
    相关资源
    最近更新 更多