2009-04-23 11 views
17

जावा में, क्या कोई एप्लिकेशन चल रहा है, जबकि फ्लाई पर कक्षा परिभाषा बनाना संभव है, और फिर उस वर्ग का ऑब्जेक्ट बनाएं?जावा अनुप्रयोग चलाते समय कक्षा को परिभाषित करना

उदाहरण के लिए, एक चल रहे एप्लिकेशन को टेक्स्ट फ़ाइल में पढ़ा जाएगा जिसमें कक्षा के सदस्यों की सूची नई कक्षा में शामिल करने के लिए होगी। आवेदन तब सदस्यों की सूची के आधार पर कक्षा परिभाषा को परिभाषित करेगा, और फिर इसे रोक देगा।

+25

इस प्रकार स्काईनेट शुरू हो गया है। – TheTXI

+7

यदि जावा में स्काईनेट लिखा गया था, तो इसे कभी भी खतरे के लिए बहुत अधिक स्मृति की आवश्यकता होगी। – Pesto

+4

स्काईनेट बस खुद को चलाने के लिए एक बड़ा क्लस्टर बनाएगा। तथ्य यह है कि जावा में लिखा गया यह समझ में आता है क्योंकि स्काईनेट और जावा दोनों मानवता के अंत तक खत्म हो जाएंगे। – TheTXI

उत्तर

11

हां सिद्धांत में ऐसा करना संभव है आपकी कक्षा फ़ाइल बाइट कोड है जो अंत में एक बाइट सरणी है! इसके बाद आप कक्षा परिभाषा प्राप्त करने के लिए विधि defineClass (स्ट्रिंग, बाइट [], int, int) का उपयोग कर सकते हैं जिसका उपयोग प्रतिबिंब के माध्यम से वस्तुओं को तुरंत चालू करने के लिए किया जा सकता है।

अभ्यास में आप CGLib या javaassist जैसे कुछ का उपयोग कर सकते हैं।

आप फ़ाइल में जावा कोड उत्पन्न करने, संकलक का आह्वान करने, फिर फ़ाइल लोड करने के लंबे तरीके का भी उपयोग कर सकते हैं।

1

आप अपनी नई कक्षा के लिए कोड को लिखकर ऐसा कर सकते हैं, फिर उस फ़ाइल पर जावा कंपाइलर का आह्वान कर सकते हैं और क्लासलोडर का उपयोग करके उस वर्ग को अपने चल रहे एप्लिकेशन में गतिशील रूप से लोड कर सकते हैं। अपाचे टॉमकैट अपने जेएसपी पृष्ठों के लिए ऐसा करता है; यह कोड लेता है, इसमें कुछ बदलाव करता है, इसे कक्षा के बीच में एक कोशिश/पकड़ ब्लॉक में लपेटता है, जो तब फाइल सिस्टम को लिखता है, इसे संकलित करता है, और अनुरोध करने के लिए इसे प्राप्त करने और मुकदमा चलाने के लिए क्लासलोडर का उपयोग करता है।

1

निश्चित रूप से यह संभव है। उदाहरण के लिए यह article देखें।

0

शायद एक छोटे से overkill का उपयोग कर वर्गों उत्पन्न कर सकते हैं, Apache BCEL (बाइट कोड इंजीनियरिंग लाइब्रेरी) रनटाइम के दौरान class फ़ाइलें बनाने के लिए इस्तेमाल किया जा सकता।

हालांकि मैंने इसे स्वयं नहीं किया है, अनुमानतः, कोई भी कक्षा बना सकता है, इसे लोड कर सकता है, और रनटाइम के दौरान इसे तुरंत चालू कर सकता है।

0

हां, यह संभव है।

आप कक्षा के शरीर को परिभाषित करके और अपने नए वर्ग को संकलित करके जाकर Javassist के साथ कक्षाएं बना सकते हैं।

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

Javassist JBoss पर प्रयोग किया जाता है, और मुझे लगता है कि एक अच्छा संदर्भ :) है

ही BCEL के साथ प्राप्त किया जा सकता है, लेकिन यह बहुत कठिन है (लेकिन इस तरह से आप क्या उत्पन्न किया जा रहा है पर अधिक नियंत्रण है)।

0

यदि आप जरूरी हैं तो आप शायद जेआरबी, या जेपीथॉन या ग्रोवी के साथ ऐसा कुछ कर सकते हैं।

यदि आप विशेष रूप से मासोचिस्टिक महसूस कर रहे हैं तो आप BCEL देख सकते हैं।

0

यदि आप जावा और मेटाप्रोग्रामिंग चाहते हैं, तो Groovy का उपयोग करें।

+0

हाय स्टीफन, तो ग्रोवी कर सकते हैं फ्लाई पर जावा क्लास रनटाइम पर संकलन करने में मदद करें और इसे तुरंत चालू करें? क्या आपके पास यह करने के बारे में कोई संकेतक है? – Sergio

0

ASM जावा के लिए निम्नतम स्तर बाइटकोड लाइब्रेरी है, मुझे लगता है। यह बहुत कठिन बनाता है लेकिन बहुत शक्तिशाली भी बनाता है।मैं एएसएम के दस्तावेज़ीकरण (PDF) को वास्तव में समझने की सलाह देता हूं कि जावा में बाइटकोड पीढ़ी कैसे काम करती है। वह दस्तावेज यह भी बताता है कि क्लास लोडर में बाइटकोड कैसे लोड करें (सही करने के लिए एक और कठिन विषय)।

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

1

शायद सरल समाधान (अतिरिक्त पुस्तकालयों की जरूरत नहीं करने के मामले में) Java compiler API कि जावा 6. आप के साथ आता है का उपयोग करने के लिए सिर्फ बस, जावा उत्पन्न संकलन और फिर एक Class.forName प्रदर्शन करने में सक्षम होना होगा()।

+0

जो केवल तभी काम करेगा यदि jdk इंस्टॉल है, है ना? – Sergio

0

in-memory compilation के बारे में यहां एक हालिया प्रश्न था जो आपको स्रोत कोड उत्पन्न करने में कामयाब होने के बाद क्या करना है इसके बारे में कुछ संकेत देना चाहिए।

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