2

有没有办法从 JavaScript (Nashorn) 获取和使用扩展的 Java 类?

我想做的是在 Nashorn 中扩展一个 Java 类,然后将其传递回 Java。例如,我们在 JS 中定义一个扩展另一个类的类:

var SomeClass= Java.type("com.test.SomeClass");
var MySomeClass = Java.extend(SomeClass, {
    aMethod1: function() {
        print("m1");
    },
    aMethod2: function() {
        print("m2");
    },
}); 

然后我尝试在 Java 中获取这个扩展对象,如下所示:Object mySomeClass = scriptEngine.get("MySomeClass");

但是,我无法在 Java 中对此对象进行任何方法调用。当我尝试将其强制转换为基类时,它总是会引发异常 - com.test.SomeClass

是否可以在 Java 中使用在 Nashorn (JS) 中创建的扩展类?

4

1 回答 1

3

这是一个扩展ArrayList的工作示例:

String script = "(function() {\n" +
  "  var ArrayList = Java.type('java.util.ArrayList')\n" +
  "  var ArrayListExtender = Java.extend(ArrayList)\n" +
  "  var list = new ArrayListExtender() {\n" +
  "    get: function(idx) {\n" +
  "      return idx >= list.size() ? " +
  "'no such value' : Java.super(list).get(idx);\n" +
  "    }\n" +
  "  }\n" +
  "  return list;\n" +
  "} ());";

  ScriptEngine engine = new ScriptEngineManager().getEngineByName("JavaScript");
  @SuppressWarnings("unchecked")
  List<String> result = (List<String>) engine.eval(script);
  result.add("gotcha");
  System.out.println(result.get(0));
  System.out.println(result.get(10));

您没有说明您遇到了什么异常,但问题可能在于您如何使用或使用该类型。请注意,Java.typeJava.extend 都不返回java.lang.Class - 这些方法返回带有未记录 API 的内部 Nashorn 类型。

于 2014-06-10T11:07:09.763 回答