2016-07-07 44 views
0

我有一個基類,它需要Entity作爲其構造函數參數。我在JavaScript擴展這個基類,它看起來像這樣:Java Nashorn在Java中創建JS對象時,當我有一個對象表示JS函數

Java.extend(BaseClass, { 
     someAbstractMethod : function() { ... }, 
     someAdditionalField : ..., 
     etc 
}) 

據我的理解,我不能使用額外的字段/方法,如果我有這樣的先例,作爲一個Java對象,但我可以的,如果它是一個JavaScript對象。那麼,如何使用Java代碼將此類實例化爲JS對象?

public class ScriptedEntity extends Entity implements Scripted<EntityScriptFunctions> { 

    private CompiledScript script; 
    private Object implemented_script_class; 
    private Object my_script_instance; 
    private Invocable invocable; 

    public ScriptedEntity(float x, float y, CompiledScript script) { 
     super(x, y); 
     invocable = (Invocable) script.getEngine(); 
     try { 
      implemented_script_class = script.eval(); 
      my_script_instance = invocable.invokeFunction("???", this); //'this' is the constructor argument 
     } catch (ScriptException | IllegalArgumentException | NoSuchMethodException | SecurityException e) { 
      e.printStackTrace(); 
     } 
    } 

    ... 

} 

回答

2

是的,用Java.extend,你只能重寫超類方法。您不能將新的Java字段或新的Java方法添加到生成的子類中。

如果你的問題是關於如何從Java代碼中的javascript函數做相當於JS的「新」,則:

import javax.script.*; 
import jdk.nashorn.api.scripting.*; 

public class Main { 
    public static void main(String[] args) throws Exception { 
    ScriptEngineManager m = new ScriptEngineManager(); 
    ScriptEngine e = m.getEngineByName("nashorn"); 
    e.eval("function Point(x, y) { this.x = x; this.y = y}"); 
    JSObject pointFunc = (JSObject)e.get("Point"); 
    JSObject pointObj = (JSObject)pointFunc.newObject(43, 55); 
    System.out.println(pointFunc.isInstance(pointObj)); 
    System.out.println(pointObj.getMember("x")); 
    System.out.println(pointObj.getMember("y")); 
    } 
} 

參見:https://docs.oracle.com/javase/8/docs/jdk/api/nashorn/jdk/nashorn/api/scripting/JSObject.html

創建Java類的實例用Java.extend定義,你可以定義一個腳本函數來創建Java對象。您可以通過Invocable.invokeFunction或JSObject.call從Java代碼調用該函數。

import java.util.*; 
import javax.script.*; 
import jdk.nashorn.api.scripting.*; 

public class Main { 
    public static void main(String[] args) throws Exception { 
    ScriptEngineManager m = new ScriptEngineManager(); 
    ScriptEngine e = m.getEngineByName("nashorn"); 
    e.eval("var MyHashMap = Java.extend(java.util.HashMap, {})"); 
    e.eval("function createMyHashMap() { return new MyHashMap(); }"); 
    HashMap hm = (HashMap) ((Invocable)e).invokeFunction("createMyHashMap"); 
    System.out.println(hm); 
    } 
}