2014-06-10 69 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(...)時/之後實際創建一個對象。 :) –