当前位置: 首页 > 面试题库 >

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

池照
2023-03-14
问题内容

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

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

定义此接口:

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



 类似资料:
  • 我正在尝试使用java软件weka的API。我写了下面的测试代码: 当我在Eclipse中执行它时,它工作正常。但是,我无法让它在终端中运行。 我尝试在编译期间提供. jar路径,然后从已编译类的目录中执行程序。 此方法不起作用,我收到以下错误: 异常线程"main"java.lang.NoClassDefFoundError: weka/core/实例在hello_weka.main(hello

  • 问题内容: 我有一个Java类:: 这给了我一个Json数组。现在,我想在JavaScript中一次又一次调用此类的method()以获得新值,因为我更新了我的数据库。我有一个数据网格,当页面首次加载此json数组中的一组值时,该网格运行良好。但是如何使用Ajax刷新数据。或者如何使用Ajax调用method()以便当我单击页面上的按钮时刷新数据。我在Java脚本中调用此方法的代码是:: 我在通过

  • 问题内容: 我有以下由Eclipse生成的代码(.java文件)。 现在,我想从命令行编译以上文件。我转到了源代码所在的目录,并尝试了两个命令: 1. javac HelloWorldSWT.java 2. javac -d / home / myname / workspace / HelloWorldSWT.java 在这两种情况下,我都有相同的错误“无法解析导入org.eclipse”。/

  • 对象类是每个类的基类,即每个类都扩展了对象类。Object类中有一个公共String toString()方法,而String类中也存在同样的方法。现在,String类还扩展了Object类,方法toString返回一个String类型。 我的问题是-:在编译Object类时,它将搜索String.class,而String类将搜索Object.class,从而创建一种相互依赖的类型。这种依赖是如

  • 问题内容: 我有一个简单的Java类,其中包含一些方法: 我想创建此类的实例,并允许Javascript代码直接调用方法,如下所示: 我目前只能弄清楚的唯一方法是使用 然后在Javascript代码中使用。我还可以使用Javascript为每个方法编写包装器函数,但是应该有一种更简单的方法来自动为类的所有公共方法执行此操作。 问题答案: 我对Rhino并不是很熟悉,但是这样的方法应该可以工作: 只

  • 当我运行来自CMD ClassNotFoundException的代码时,会引发错误。 如何正确地将。jar文件与LocationServer.java连接起来,以便找到MySql驱动程序类?