注:以下は、Java 8の場合、Nashornエンジンを使用した場合のものです。
最初にコードをコンパイルするには、println()
ステートメントから.value
を削除します。 obj
はタイプObject
と宣言され、Object
はvalue
フィールドを持ちません。あなたが機能を持っていないので、あなたは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
'return obj;'を削除すると動作しますか? return文は関数内にあるはずですが、そのクラスがJSコードをどのように評価するのか分かりません。 –
どのように動作するかはわかりません。私はいくつかの例とドキュメントを見ただけです。私はおろすと同じエラーが出ます。 – hjk321
おそらく、オブジェクト自体を返さない 'var'ステートメントのためです。かっこで囲まれたオブジェクトだけが機能するかもしれません。有効なプログラムには括弧が必要です。 –