从Nashorn获取扩展的Java类

时间:2014-06-10 08:32:39

标签: java javascript inheritance nashorn

有没有办法从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)中创建的扩展类?

1 个答案:

答案 0 :(得分: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.type Java.extend 都不返回 java.lang.Class - 这些方法返回带有未记录API的内部Nashorn类型