2017-11-07 15 views
0

私はナショーンといくつかの経験をしています。java Nashorn ReferenceError

私はこの単純なコードをJavaで作成しました。ここでは、私が定義したカスタムオブジェクトを使用します。

 ScriptEngine engine = new 
     ScriptEngineManager().getEngineByName("javascript"); 
     System.out.println("engine = " + engine.getClass().getName().toString()); 

     engine.put("id", "2"); 
     System.out.println("id = " + engine.eval("id")); 

     Object person = engine.eval("importClass(Data.com.personal.Person)"); 

私は次のエラーを返します。今、私はそれをグーグル

 Exception in thread "main" javax.script.ScriptException: ReferenceError: "importClass" is not defined in <eval> at line number 1 

、彼らが使用することを言う:

 load("nashorn:mozilla_compat.js"); 

が、私は、私は(を置く場所に少し混乱していたり使用方法)このロード機能?


でクラスの仕事をインポートするには、UPDATE

nashornそれは、このような呼び出しにする必要があります:P

+0

[OK]を欠落しているステップは、私がengine.eval内の負荷を呼び出す必要が明らかでした –

答えて

1

使用:それは私には明らかではなかったいくつかの理由で

engine.eval("importClass(com.personal.Person)"); 

をナショーン、あなたは使用する必要があります:

var MyJavaClass = Java.type('my.package.MyJavaClass');

これで、カスタムJavaクラスを使用できます。

詳細については、この優れた導入を参照してください:http://winterbe.com/posts/2014/04/05/java8-nashorn-tutorial/

コンプリート例:

public final class NashornTest { 

    // Class can even be inner class. Must be public however! 
    public static class MyData { 

     private int id; 
     private String name; 

     public MyData(int id, String name) { 
      this.id = id; 
      this.name = name; 
     } 

     public int getId() { 
      return id; 
     } 

     public void setId(int id) { 
      this.id = id; 
     } 

     public String getName() { 
      return name; 
     } 

     public void setName(String name) { 
      this.name = name; 
     } 

     @Override 
     public String toString() { 
      return String.format("MyData[%d, %s]", id, name); 
     } 

    } 

    @Test 
    public void test() throws ScriptException { 
     final ScriptEngineManager sem = new ScriptEngineManager(); 
     final ScriptEngine se = sem.getEngineByName("javascript"); 

     Object obj = se.eval(
      "var MyJavaData = Java.type('test.el.NashornTest$MyData');" + 
      "new MyJavaData(42, 'The usual number');"); 

     // prints MyData[42, The usual number] 
     System.out.println(obj); 
    } 

} 
関連する問題