【问题标题】:Get extended Java class from Nashorn从 Nashorn 获取扩展的 Java 类
【发布时间】:2014-06-10 08:32:38
【问题描述】:

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

【问题讨论】:

    标签: java javascript inheritance nashorn


    【解决方案1】:

    这是一个扩展 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 类型.

    【讨论】:

    • 谢谢 McDowell,它现在可以工作了。我的错误很简单,我忘记在使用 Java.Extend(...) 时/之后实际创建一个对象。 :)
    猜你喜欢
    • 2020-01-30
    • 2017-07-20
    • 1970-01-01
    • 2021-10-27
    • 1970-01-01
    • 2012-07-11
    • 1970-01-01
    • 2018-06-11
    • 2023-03-08
    相关资源
    最近更新 更多