주 : 다음은 Nashorn 엔진을 사용하는 Java 8에 대한 것입니다.
먼저 코드를 컴파일하려면 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>
을 구현하는 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
'return obj; '를 삭제하면 제대로 작동합니까? return 문은 함수에 있어야하지만 클래스가 JS 코드를 평가하는 방법을 알지 못합니다. –
나는 그것이 어떻게 작동하는지에 관해 정말로 모른다. 방금 몇 가지 예제와 설명서를 보았습니다. 내가 ommiting 때 같은 오류가 발생합니다. – hjk321
아마'var' 문 때문에 객체 자체를 반환하지 않을 것입니다. 괄호 안에 싸인 객체 만 작동 할 수 있습니다. 유효한 프로그램을 위해서는 괄호가 필요합니다. –