2009-07-03 11 views
7

एक जावा प्रोग्राम मैं एक उपयोगकर्ता परिभाषित जावास्क्रिप्ट कार्यक्रम लागू कर रहा हूँ में:जावा स्क्रिप्टइंजिन: जावा पक्ष पर मूल्य का उपयोग कर?

File userJSFile=...; 
javax.script.ScriptEngineManager mgr=new ScriptEngineManager(); 
javax.script.ScriptEngine scripEngine= mgr.getEngineByExtension("js"); 
Object result=scripEngine.eval(new java.io.FileReader(userJSFile)); 

अब मैं चाहते हैं 'परिणाम' का उपयोग करने के लिए: मैं इसे कैसे करने के लिए एक पहुँच हो सकती है? मैं इसे, एक सरणी (मैं अपने सदस्यों फेंक दिया पुनरावृति कर सकते हैं), एक String के रूप में पहचान कर सकते हैं एक Integer, आदि ...?

धन्यवाद

संपादित: मैं सिर्फ इतना पता है कि मेरे उपयोगकर्ता मुझे अंतिम मान लौट रहा एक स्क्रिप्ट दे दी है। मुझे इस मूल्य के बारे में कुछ नहीं पता है। क्या यह String, एक सरणी आदि है ..? मुझे नहीं पता लेकिन मैं इसका इस्तेमाल करना चाहता हूं।

उत्तर

0

यह link सहायक हो सकता है। ऐसा लगता है कि आप सबसे अच्छा कर सकते हैं एक कार्यान्वयन विशिष्ट वर्ग पर भरोसा करना है।

9

शायद साधारण मूल्यों के अलावा, मैं स्क्रिप्टिंग इंजन को अपने मूल्यों को जावा प्रकारों पर केंद्रित करने देता हूं।

public class ScriptDemo { 

    static class Result { 
    private String[] words; 

    public void setWords(String[] words) { 
     this.words = words; 
    } 
    } 

    static final String SCRIPT = "var foo = 'Hello World!';\n" 
     + "result.setWords(foo.split(' '));"; 

    public static void main(String[] args) 
     throws ScriptException { 
    Result result = new Result(); 
    javax.script.ScriptEngineManager mgr = new ScriptEngineManager(); 
    javax.script.ScriptEngine scripEngine = mgr 
     .getEngineByExtension("js"); 
    scripEngine.getContext().setAttribute("result", result, 
     ScriptContext.ENGINE_SCOPE); 
    scripEngine.eval(SCRIPT); 
    System.out.println(Arrays.toString(result.words)); 
    } 

} 

यहां तक ​​कि अगर आप स्क्रिप्ट संपादित नहीं कर सकते, तो आप वापसी मान लेते हैं और बलात्कार करने के लिए अपने स्वयं के उत्पन्न स्क्रिप्ट के माध्यम से इसे पारित कर सकते हैं। यह मानता है कि आपको वापस आने वाले मूल्य के बारे में कुछ पता है।


संपादित करें: कुछ भी नहीं है के बाद से वापसी मान के बारे में जाना जाता है, मैं पहली बार यह अगर यह java.lang प्रकारों में से एक था देखने के लिए जावा (getClass()) का उपयोग कर का परीक्षण होगा। लौटे वस्तु कुछ एपीआई पुस्तकालय के लिए निजी से है, तो मैं इसे (इस मामले जावास्क्रिप्ट में) पटकथा भाषा का उपयोग कर आत्मनिरीक्षण हैं, संभवतः एक जावा प्रकार के लिए यह मजबूर या प्रक्रिया के दौरान कुछ जावा डेटा संरचना में उसके गुण धक्का।

मेरी जावास्क्रिप्ट जंगली है, लेकिन जॉन लीच का ट्यूटोरियल काफी अच्छा दिखता है: JavaScript Introspection

(आप जावा प्रतिबिंब उपयोग करने में सक्षम हो सकता है, लेकिन जब से इंजन कार्यान्वयन जावा संस्करणों/JREs/जावास्क्रिप्ट इंजन के बीच भिन्न हो सकता है, मैं इसे पर भरोसा नहीं होता।)

2

यह सवाल पूछा गया था उम्र के पहले, लेकिन जवाब अभी भी सही लग रहा था। यदि जावा और जावास्क्रिप्ट के बीच जटिल वस्तुओं को पारित करने की कोशिश कर रहे किसी और के लिए यह रुचि है, तो मैं अपना समाधान प्रस्तुत करना चाहता था।

मैंने एक स्क्रिप्ट लिखी है जो मूल ऑब्जेक्ट (इन-मेमोरी) जेएसओएन ऑब्जेक्ट्स (वास्तव में मैं मोंगोडीबी के बीएसओएन-आधारित ऑब्जेक्ट्स का उपयोग करता हूं, लेकिन आपको नीचे नमूना कोड में JSONArray और JSONObject के लिए 1-1 को प्रतिस्थापित करने में सक्षम होना चाहिए)।

इसलिए उदाहरण के लिए

, कहते हैं कि मैं एक (उपयोगकर्ता) स्क्रिप्ट "create_object_script" है, जो "रिटर्न" किसी वस्तु या ब्याज की सरणी, तो मैं यह JSON में (यानी HashMaps की एक सूची) में परिवर्तित कर सकते हैं इस प्रकार है:

Object returnVal = engine.eval(create_object_script); 
engine.put("output", returnVal); 
BasicDBObject objFactory = new BasicDBObject(); // (or JSON equivalent) 
BasicDBList listFactory = new BasicDBList(); // (or JSON equivalent) 
BasicDBList outList = new BasicDBList(); // (or JSON equivalent) 
engine.put("objFactory", objFactory); 
engine.put("listFactory", listFactory); 
engine.put("outList", outList); 
engine.eval(parsing_script); // (described below) 
// "outList" is now populated with (in-memory) JSON representations of "returnVal" 

स्पष्ट रूप से यदि आपके पास "create_object_script" स्क्रिप्ट पर नियंत्रण है तो आप इसे एक ही चरण में कर सकते हैं; मेरी स्क्रिप्ट उपयोगकर्ता जनित तो यह जटिलता दूर छिपा रहे हैं के लिए आवश्यक है - उन सिर्फ स्क्रिप्ट लिखने जहां "वापसी मान" अंतिम पंक्ति है।

मैंने इस पोस्ट की लंबाई को रखने के लिए "parsing_script" here पर जोर दिया।

कार्यात्मक रूप से यह बहुत अच्छी तरह से काम करता है; मैंने जेएस में बहुत कुछ विकसित नहीं किया है, इसलिए यह संभव है कि ऐसा करने के अधिक कुशल तरीके हैं। (ध्यान दें कि मुझे हमेशा एक सूची में अपने परिणामों की आवश्यकता होती है, यदि आप नहीं करते हैं तो आप बेसिक डीबीबीब्जेक्ट "आउटऑबज" में पास कर सकते हैं और इसके बजाय सिंगलटन मामले में लिख सकते हैं)।

आशा है कि यह किसी ऐसे व्यक्ति की मदद करे जो पिछली रात 1 बजे मेरी स्थिति में खुद को पाता है!

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