2008-10-13 10 views
10

मैं "javac" प्रक्रिया या इस तरह के कुछ उपयोग किए बिना रनटाइम पर एक स्ट्रिंग से बाइटकोड (बाइट []) कैसे उत्पन्न कर सकता हूं? क्या संकलक को कॉल करने का एक आसान तरीका है?जावा इन-मेमोरी संकलन

इसका अतिरिक्त:

मैं accept the solution that actually best fits my situation का फैसला किया। मेरा आवेदन अभी भी डिज़ाइन स्केच चरण में एक शौक-प्रोजेक्ट है, और यह नई तकनीक डालने पर विचार करने का सही समय है। भी, चूंकि जिस व्यक्ति को बीएल के साथ मेरी मदद करने के लिए माना जाता है वह एक जावास्क्रिप्ट डेवलपर है, इसलिए स्टब कंपाइलर + क्लासलोडर के बजाय जावास्क्रिप्ट दुभाषिया का उपयोग करने का विचार इस स्थिति में मेरे लिए अधिक आकर्षक लग रहा है। इस प्रश्न के अन्य (अस्वीकार्य) उत्तर जानकारीपूर्ण हैं और जहां तक ​​मैं कह सकता हूं, मेरे प्रश्न का उत्तर बहुत अच्छा है, इसलिए धन्यवाद, लेकिन मैं Rhino कोशिश करने जा रहा हूं :)

उत्तर

4

आपको कुछ ऐसा लगता है जैसे गैंडो या ग्रोवी अभ्यास में अधिक उपयोगी।

+0

यद्यपि आपने तकनीकी रूप से मेरे प्रश्न का उत्तर नहीं दिया है, आपने मेरे लिए एक नई संभावना खोली है, जो मुझे लगता है कि अभ्यास में अधिक उपयोगी साबित होगा (हालांकि इसे और सीखने की आवश्यकता होगी)। मेरा धन्यवाद! (+ अपवॉव) –

+1

शायद मुझे थोड़ा और स्पष्ट होना चाहिए था कि मैं खुद ही एक ही विचार प्रक्रिया के माध्यम से चला गया। मैं गैंडो का उपयोग कर समाप्त हुआ क्योंकि यह अब जेडीके का हिस्सा है। शुभकामनाएँ – Draemon

0

आप तब तक संकलक तक पहुंच सकते हैं जब तक आपके जेडीके से tools.jar फ़ाइल क्लासपाथ पर न हो। इसके लिए प्रलेखन here है। एपीआई कुछ व्याख्या की गई भाषाओं में eval() जितनी सरल नहीं है लेकिन यह वहां है।

आपको वास्तव में उस कोड को चलाने के लिए कुछ अजीब क्लासलोडर कोड में भी जाना पड़ सकता है, मुझे इसके बारे में पूरी तरह से यकीन नहीं है।

12

जेडीके 6 में Java compiler API है। हालांकि, उपयोग करना जरूरी नहीं है।

एक त्वरित Google ने this example usage खींच लिया।

+1

लिंक के लिए धन्यवाद! इस उदाहरण को मिला जो मेरे लिए वास्तव में अच्छा काम करता है: http://www.javablogging.com/dynamic-in-memory-compilation/ – Peter

6

मुझे लगता है कि आपका सबसे अच्छा शॉट Janino होगा। इससे आप रनटाइम पर कोड संकलित कर सकते हैं और इसे अपने शेष कार्यक्रम से कॉल कर सकते हैं। हम इसे कुछ कक्षाओं में गतिशील रूप से अपडेट करने के लिए अपने कुछ सिस्टमों में इसका उपयोग करते हैं।

यह मुफ़्त नहीं है। यह अच्छी तरह से काम करता है, लेकिन जब भी आप एक नई कक्षा (या कक्षा का संस्करण) लोड करते हैं तो यह परमजन स्पेस का उपयोग करता है ताकि आप अंततः स्मृति से बाहर हो जाएंगे यदि आपके पास (वास्तव में) लंबी चल रही प्रक्रिया है (या कुछ जो नई कक्षाएं लोड करता है) लेकिन यदि आप एक समस्या है तो उस बाधा को एक तरह से बाहर ले जाने के लिए आप JVM में परमजन स्पेस की मात्रा बदल सकते हैं।

जेनिनो वास्तव में एक कंपाइलर है, लेकिन आप देख सकते हैं कि अगर आप उस स्तर पर परिचालन करने की आवश्यकता है तो यह बाइटकोड कैसे इंजेक्ट करता है। आपको क्लासलोडर बनाने या जावा कंपाइलर एपीआई का उपयोग करने की आवश्यकता हो सकती है क्योंकि टॉम हौटिन ने सुझाव दिया था।

+0

मैंने एक परियोजना के लिए जानिनो का उपयोग किया है। इसमें कुछ सीमाएं हैं लेकिन यह अच्छी तरह से काम करती है। यह मुझे पता है कि एलपीजीएल है ... –

+0

@ मारियो ऑर्टेगॉन: सहमत। हमने थोड़ा पुराना संस्करण इस्तेमाल किया जिसने किसी भी जावा 1.5 सुविधाओं का समर्थन नहीं किया जो दर्द था। उन्होंने इसे सुधार लिया है, हालांकि कुछ (जैसे (ऑब्जेक्ट: संग्रह) वाक्यविन्यास) अभी भी गायब हैं। – MBCook

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