2016-06-26 2 views
3

ScriptEngine 클래스를 사용하여 자바에서 자바 스크립트를 평가하려고합니다. 여기에 내가 뭘하려고 오전의 짧은 예입니다자바 : ScriptEngine에서 객체 반환하기

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

나는 그것이 어떻게 작동하는지에 관해 정말로 모른다. 방금 몇 가지 예제와 설명서를 보았습니다. 내가 ommiting 때 같은 오류가 발생합니다. – hjk321

+0

아마'var' 문 때문에 객체 자체를 반환하지 않을 것입니다. 괄호 안에 싸인 객체 만 작동 할 수 있습니다. 유효한 프로그램을 위해서는 괄호가 필요합니다. –

답변

4

주 : 다음은 Nashorn 엔진을 사용하는 Java 8에 대한 것입니다.

먼저 코드를 컴파일하려면 println() 문에서 .value을 제거하십시오. objObject 유형으로 선언되고 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에 연결했습니다.

ScriptObjectMirrorMap<String, Object>을 구현하는 Bindings을 구현하므로 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 : 오류 :보고되지 않은 예외 ScriptException; 잡히거나 throw되어야한다고 선언해야합니다. Bindings obj = (Bindings) engine.eval ("var obj = {value : 1}; obj;"); ^ eval 후에 괄호에 1 개의 오류가 있습니다. – hjk321

+0

그래서'throws ScriptException'을'main()'에 추가하십시오. – Andreas

+0

남자, 나는 너무 바보 같아. 도와 주셔서 감사합니다. – hjk321

관련 문제