2016-06-26 2 views
3

ScriptEngineクラスを使用してJavaでJavaScriptを評価しようとしています。ここで私が何をしようとしています何の短い例です:Java:ScriptEngineからオブジェクトを返すjavacript

import javax.script.ScriptEngineManager; 
import javax.script.ScriptEngine; 

public class Test { 
    public static void main(String[] args) { 
     ScriptEngine engine = new ScriptEngineManager().getEngineByName("js"); //Creates a ScriptEngine 
     Object obj = engine.eval("var obj = { value: 1 }; return obj; "); // Evals the creation of a simple object 
     System.out.println(obj.value); // I get an invalid token error when trying to print a property of the object 
    } 
} 

は、私はかなり確信しているが、このべき仕事...しかし、私は困惑し、私は私が得ることができる任意のヘルプを取りますよ。

+0

'return obj;'を削除すると動作しますか? return文は関数内にあるはずですが、そのクラスがJSコードをどのように評価するのか分かりません。 –

+0

どのように動作するかはわかりません。私はいくつかの例とドキュメントを見ただけです。私はおろすと同じエラーが出ます。 – hjk321

+0

おそらく、オブジェクト自体を返さない 'var'ステートメントのためです。かっこで囲まれたオブジェクトだけが機能するかもしれません。有効なプログラムには括弧が必要です。 –

答えて

4

注:以下は、Java 8の場合、Nashornエンジンを使用した場合のものです。

最初にコードをコンパイルするには、println()ステートメントから.valueを削除します。 objはタイプObjectと宣言され、Objectvalueフィールドを持ちません。あなたが機能を持っていないので、あなたはreturnを呼び出すことはできませんので、ある

Exception in thread "main" javax.script.ScriptException: <eval>:1:25 Invalid return statement 
var obj = { value: 1 }; return obj; 
         ^in <eval> at line number 1 at column number 25 

あなたがそれを行うたら、コードを実行するとき、あなたは次の例外を取得します。スクリプトの戻り値は最後の式の値なので、ちょうどobjと言います。

今すぐ実行し、[object Object]を印刷します。戻ってきたオブジェクトのタイプを確認するには、println(obj.getClass().getName())に変更してください。それはjdk.nashorn.api.scripting.ScriptObjectMirrorを印刷します。私はあなたの便宜のためにjavadocにリンクしました。

ScriptObjectMirrorは、Map<String, Object>を実装するを実装していますので、get("value")と呼ぶことができます。コード作業

は次のようになります。それを行う方法について

import javax.script.*; 

public class Test { 
    public static void main(String[] args) throws ScriptException { 
     ScriptEngine engine = new ScriptEngineManager().getEngineByName("js"); 
     Bindings obj = (Bindings)engine.eval("var obj = { value: 1 }; obj; "); 
     Integer value = (Integer)obj.get("value"); 
     System.out.println(value); // prints: 1 
    } 
} 

UPDATE

The whole point was to create an object with functions, is that possible with this engine? There isn't a Function object.

例:

import javax.script.ScriptEngine; 
import javax.script.ScriptEngineManager; 

import jdk.nashorn.api.scripting.ScriptObjectMirror; 

public class Test { 
    public static void main(String[] args) throws Exception { 
     String script = "var f = {\n" + 
         " value: 0,\n" + 
         " add: function(n) {\n" + 
         " this.value += n;\n" + 
         " return this.value;\n" + 
         " }\n" + 
         "};\n" + 
         "f; // return object to Java\n"; 
     ScriptEngine engine = new ScriptEngineManager().getEngineByName("js"); 
     ScriptObjectMirror obj = (ScriptObjectMirror)engine.eval(script); 
     System.out.println("obj.value = " + obj.getMember("value")); 
     System.out.println("obj.add(5): " + obj.callMember("add", 5)); 
     System.out.println("obj.add(-3): " + obj.callMember("add", -3)); 
     System.out.println("obj.value = " + obj.getMember("value")); 
    } 
} 

OUTPUT

obj.value = 0 
obj.add(5): 5.0 
obj.add(-3): 2.0 
obj.value = 2.0 
+0

'/tmp/java_4eJZg9/Test.java:16:error:報告されていない例外ScriptException;キャッチされるか、スローされると宣言されている必要があります。 Bindings obj =(Bindings)engine。eval( "var obj = {value:1}; obj;"); evalの後の括弧のところに「 ^ 1エラー」と表示されます。 – hjk321

+0

'main()'に 'throws ScriptException'を追加します。 – Andreas

+0

男、私はとてもばかげています。助けてくれてありがとう。 – hjk321

関連する問題