Как вызвать скомпилированные Rhino методы JavaScript (файлы классов) в программе Java? - PullRequest
5 голосов
/ 20 февраля 2011

Я скомпилировал следующий файл JavaScript, «test.js», в «test.class»:

var test = (function () {
  var that = {};

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

  return that;
}());

Я хотел бы вызвать скомпилированную функцию JavaScript, «test.addNumbers (1,2) ", в простой Java-программе" run.java "следующим образом:

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 и изучил много статей и примеров, НО они показывают только, как вызывать методы JavaScript из командной строки или исходного файла "test.js".Мне нужно вызвать метод из скомпилированного файла "test.class".

Большое спасибо за вашу помощь!

1 Ответ

5 голосов
/ 20 февраля 2011

Используя 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

Указывает, что класс 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 с аргументами -implements Adder AdderImpl.js. Вызовите метод так:

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

Я бы рискнул предположить, что, вероятно, было необходимо сделать это таким образом из-за различий в системах типов языков.

Я использовал Rhino 1.7R2. Для краткости я избегал использования пакетов и т. Д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...