2014-04-15 10 views
5

मेरे पास निम्न प्रोग्राम है, जो जावा (जावाशॉट) में जावास्क्रिप्ट निष्पादित करता है। जावास्क्रिप्ट कोड किसी ऑब्जेक्ट को वापस कर रहा है।जावा ऑब्जेक्ट में जावास्क्रिप्ट (nashorn) द्वारा लौटाए गए मानों को अनबॉक्स कैसे करें?

public Object execute(){ 
     ScriptEngineManager sem = new ScriptEngineManager(); 
     ScriptEngine e = sem.getEngineByName("nashorn"); 
     Invocable invocable = (Invocable)e; 
     ScriptEngineFactory f = e.getFactory(); 
     Object result; 
     try { 
      String statement = "function fetch(value, count) { count++ ; return {'value': value,'count' : count} }; } ; "; 
      CompiledScript cs = ((Compilable)e).compile(statement); 
      cs.eval(); 
      result = invocable.invokeFunction("fetch", 10,2); 

     } 
     catch (Exception se) { 
      String version = System.getProperty("java.version"); 
      System.out.println(version); 
      result = "script exception "; 
     } 

मैं जावा में अपने परिणाम ऑब्जेक्ट में ऑब्जेक्ट मानों को कैसे एक्सेस करूं? प्रारंभ में, मैंने परिणाम प्राप्त करने के लिए result.toString() का उपयोग करने का प्रयास किया। return [Object Object]

लगता है वहाँ एक रास्ता है, जहां मैं result वस्तु मैं result.value के बराबर मान मिल सकता है ऐसा है कि, और result.count (जावास्क्रिप्ट के समान) के लिए परिणाम वापस कर सकता है।

उत्तर

3

आप जावास्क्रिप्ट फ़ंक्शन से JSObject वापस नहीं लौटते हैं। वैध

{ 
    value: value, 
    count : count 
} 

तो आप इस जावा कोड का उपयोग कर सकते हैं।

package de.lhorn.so; 

import javax.script.Compilable; 
import javax.script.CompiledScript; 
import javax.script.Invocable; 
import javax.script.ScriptEngine; 
import javax.script.ScriptEngineManager; 
import javax.script.ScriptException; 
import jdk.nashorn.api.scripting.JSObject; 

public class SOPlayground { 

    public static void main(String[] args) throws Exception { 
     SOPlayground sop = new SOPlayground(); 
     JSObject jso = sop.execute(); 
     System.out.println("value=" + jso.getMember("value")); 
     System.out.println("count=" + jso.getMember("count")); 
    } 

    public JSObject execute() throws ScriptException, NoSuchMethodException { 
     final ScriptEngine engine = new ScriptEngineManager().getEngineByName("nashorn"); 
     final Compilable compilable = (Compilable) engine; 
     final Invocable invocable = (Invocable) engine; 

     final String statement = 
      "function fetch(value, count) { count++ ; return {value: value, count : count} };"; 
     final CompiledScript compiled = compilable.compile(statement); 

     compiled.eval(); 

     return (JSObject) invocable.invokeFunction("fetch", 10, 2); 
    } 
} 

आउटपुट:

value=10 
count=3.0 
+0

धन्यवाद एक बहुत! JSObject ने मेरा दिन बचाया। मैं ScriptObjectMirror का उपयोग कर रहा था जो मेरे मामले में कुल संख्या नहीं है। – Rahul

+0

@ राहुल नाहॉर्न 'जेएसओब्जेक्ट' इंटरफ़ेस 'jdk.nashorn.api.scripting.ScriptObjectMirror' द्वारा वास्तव में' invokeFunction' द्वारा वापस किया गया है। – Alnitak

+0

मैं वर्तमान में 'मानचित्र <स्ट्रिंग, ऑब्जेक्ट>' पर एक कास्ट का उपयोग कर रहा हूं, जो ठीक काम करता है क्योंकि 'ScriptObjectMirror' वास्तव में उस इंटरफ़ेस को लागू करता है ... क्या मुझे इसके बजाय' JSObject' का उपयोग करना चाहिए? मुझे अभी तक स्पष्ट दस्तावेज नहीं मिला है ... 'Invocable' इंटरफ़ेस केवल 'ऑब्जेक्ट' को रिटर्न प्रकार के रूप में परिभाषित करता है, जो कि बहुत बेकार है। –

6

यदि आपके प्रोग्राम का रिटर्न वैल्यू जावास्क्रिप्ट ऑब्जेक्ट है, तो आपको इसे जावा में jdk.nashorn.api.scripting.JSObject पर डालने में सक्षम होना चाहिए और उसके बाद क्वेरी और हेरफेर करने के लिए इसकी विधियों (उदा। getMember()) का उपयोग करना चाहिए।

संबंधित मुद्दे

 संबंधित मुद्दे