2012-06-20 19 views
22

मान लीजिए मैं एक जावास्क्रिप्ट फ़ाइलबाइंड विधि कॉल

function js_main(args){ 
    /* some code */ 
    var x = api_method1(some_argument); 
    /* some code */ 
} 

है और मैं हमेशा की तरह

ScriptEngineManager manager = new ScriptEngineManager(); 
ScriptEngine engine = manager.getEngineByName("javascript"); 
engine.eval(...); 

अब मैं करना चाहते हैं javax.scripting साथ इसे चलाने के लिए कोशिश मेरी जावा क्लास के साथ जावास्क्रिप्ट में api_method1 पर कॉल को संभाल लें। मैं मानचित्रण किसी तरह का लेना पसंद/कॉल की अर्थात हर बार स्क्रिप्ट कॉल api_method1(arg) एक विधि

public Object api_method1(Object arg){ ... } 

(इंजन के रूप में एक ही कक्षा में रखा) कहा जा सकता है बाध्यकारी होगा।

क्या मैं इसे प्राप्त कर सकता हूं?

उत्तर

15
  1. बाइंडिंग ऑब्जेक्ट बनाने के लिए engine.createBindings() का उपयोग करें;
  2. कुछ नाम के साथ बाइंडिंग में अपने विधि उजागर एक वस्तु डाल:

    Bindings b = engine.createBindings(); 
    b.put("api", yourApiObject); 
    engine.setBindings(b, ScriptContext.ENGINE_SCOPE); 
    
  3. फिर जावास्क्रिप्ट में

    वहाँ एक वैश्विक "API" वस्तु हो जाएगा आप कॉल कर सकते हैं:

    api.method1("foo", 14, "whatever"); 
    

सुविधा का उपयोग करना आसान है, लेकिन आप आगे और आगे जाने के साथ सावधान रहें; यह जावास्क्रिप्ट प्रकारों को जावा प्रकारों में परिवर्तित करने के लिए इतना कुछ नहीं करता है।

+0

विधि (प्राइमेटिव के अलावा) से डेटा को मार्शल करने के बारे में क्या? – emesx

+1

आदिम के अलावा डेटा को आगे और आगे पास करने के लिए आप JSON का उपयोग कर सकते हैं। आपका जावा कोड JSON लाइब्रेरी का उपयोग कर जेएसओएन को क्रमबद्ध/deserialize कर सकते हैं। – sperumal

+1

आप इसके लिए अपने आप पर बहुत अधिक हैं। आप जेएसओएन (जावास्क्रिप्ट से आसान) को क्रमबद्ध कर सकते हैं और फिर जावा में deserialize (कम आसान, लेकिन करने योग्य)। या आप अन्य जावा ऑब्जेक्ट प्रकारों को एकसाथ टुकड़े करने के लिए विभिन्न उपयोगिताओं का पर्दाफाश कर सकते हैं। – Pointy

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