2014-06-10 40 views
2

有没有办法从JavaScript(Nashorn)获取和使用扩展Java类?从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)中创建的扩展类?

回答

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 - 这些方法返回一个内部Nashorn类型与未公开的API。

+0

谢谢麦克道威尔,它现在有效。我的错误很简单,我忘了在使用Java.Extend(...)时/之后实际创建一个对象。 :) –