2016-07-07 9 views
0

私はコンストラクタ引数としてEntityをとる基本クラスを持っています。私は、Javaオブジェクトとしてのインスタンスを持っている場合、私は追加のフィールド/メソッドを使用することはできませんが、私は場合はすることができ、私の知る限り理解されるようにJava Nashornは、JS関数を表すオブジェクトを持つときにJavaでJSオブジェクトを作成します。

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

:私はJavaScriptで、この基本クラスを拡張し、それはこのようになりますこれは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メソッドを追加することはできません。その後、

あなたの質問は、JSの同等を行う方法についてのであれば、JavaコードからJavaScript関数の「新」、:

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); 
    } 
} 
関連する問題