2010-01-25 16 views
7

इसलिए मैंने हाल ही में जेडीके 1.6 में उपलब्ध नए JavaCompiler API के बारे में सीखा। यह बहुत ही सरल चल कोड से सीधे एक String एक .class करने के लिए फ़ाइल को संकलित करने के लिए बनाता है:जेडीके 1.6 से JavaCompiler 1.6: बाइट [] सरणी के लिए सीधे क्लास बाइट्स कैसे लिखें?

String className = "Foo"; 
String sourceCode = "..."; 

JavaCompiler compiler = ToolProvider.getSystemJavaCompiler(); 

List<JavaSourceFromString> unitsToCompile = new ArrayList<JavaSourceFromString>() 
    {{ 
     add(new JavaSourceFromString(className, sourceCode)); 
    }}; 

StandardJavaFileManager fileManager = compiler.getStandardFileManager(null, null, null); 
compiler.getTask(null, fileManager, null, null, null, unitsToCompile).call(); 
fileManager.close();  

ByteArrayOutputStream bos = new ByteArrayOutputStream(); 
FileInputStream fis = new FileInputStream(className + ".class"); 
IOUtils.copyStream(fis, bos); 

return bos.toByteArray(); 

आप Javadoc से JavaSourceFromString के स्रोत हड़पने कर सकते हैं।

यह वर्तमान कार्य निर्देशिका में sourceCode से Foo.class को बहुत आसानी से संकलित करेगा।

मेरा प्रश्न है: एक byte[] सरणी के लिए सीधे संकलित करने के लिए यह संभव है, और File के साथ काम कर आई/ओ पूरी तरह से messiness से बचने के?

उत्तर

2

शायद आप अपना खुद का javax.tools.JavaFileManager कार्यान्वयन कक्षा बना सकते हैं जहां आप javax.tools.FileObject का अपना कार्यान्वयन वापस कर देंगे जो डिस्क के बजाय स्मृति में इसे लिख देगा। तो javax.tools.FileObjectWriter openWriter() throws IOException विधि के अपने उप-वर्ग के लिए आप java.io.StringWriter वापस कर देंगे। सभी विधियों को उनके String समकक्षों में परिवर्तित किया जाना चाहिए।

2

कारण यह है कि बाइट सरणी में बाइटकोड लिखने के लिए कोई मानक एपीआई नहीं है कि एक जावा स्रोत फ़ाइल को संकलित करने से कई बाइटकोड फाइलें हो सकती हैं। उदाहरण के लिए, नेस्टेड/भीतरी/अज्ञात कक्षाओं वाली किसी भी स्रोत फ़ाइल के परिणामस्वरूप कई बाइटकोड फाइलें होंगी।

यदि आप अपना खुद का जावाफाइल प्रबंधक चलाते हैं, तो आपको इस स्थिति से निपटने की आवश्यकता होगी।

2

जेएसआर 199 एपीआई के साथ भेजे गए डेमो एप्लिकेशन में एक मेमोरी संकलन-से-स्ट्रिंग उदाहरण था (जो वास्तव में MemoryFileManager का उपयोग कर रहा है)। हो सकता है कि इसे here या here पर देखें (हालांकि ये नमूने थोड़े पुराने हैं, उन्हें थोड़े बदलाव की आवश्यकता होगी)। जावा.net पर How to compile on the fly? आलेख भी देखें।

पीएस: मैंने सभी विवरणों को नहीं देखा, लेकिन मुझे नहीं लगता कि यह Stephen C द्वारा उल्लिखित मामलों को संभालता है।

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