2010-11-23 10 views
7
ClassWriter cw = new ClassWriter(...); 
byte[] bytes = cw.toByteArray(); 

से नया उदाहरण bytes सरणी से नया वर्ग उदाहरण बनाना चाहता हूं। मैं यह कैसे करु? क्या यह सभी के लिए संभव है?जावा: बाइटकोड

+1

[जावा: जेवीएम में बाइट \ [\] के रूप में संग्रहीत कक्षा को कैसे लोड करें?] (Http://stackoverflow.com/questions/1781091/java-how-to-load-class-stored- as-byte-in-the-jvm) –

+0

@bruno conde: ऐसा लगता है। हम सिर्फ –

+0

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

उत्तर

8
ClassLoader.defineClass() 

संदर्भ:

+1

अच्छा जवाब लेकिन भयानक स्वरूपण और जावा 1.4 लिंक। दोनों बदल दिया। –

+0

संपादन के लिए धन्यवाद, उसके साथ संघर्ष कर रहा था, लेकिन पार्सर लिंक को ठीक से दिखाना नहीं चाहता था। –

+3

+1। वैसे भी, विधि सुरक्षित है, इसलिए आपको इसे एक्सेस करने के लिए एक तरीका चाहिए। क्लासलोडर को विस्तारित करना और सार्वजनिक विधि प्रदान करना एक समाधान हो सकता है। –

2

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

final Class clazz = loadIntoCurrentClassLoader(bytes); //I'm assuming you wrote this already using defineClass 

final YourClass foo ; 
try { 
    foo = (YourClass) clazz.newInstance(); 
} 
catch (final Exception e) { 
    throw new RuntimeException(e); 
} 
+0

मुझे पूरा यकीन है कि 'loadIntoCurrentClassLoader (बाइट्स)' भाग यही है: प्रश्न 0-32 –

+0

ठीक है तो मैं थोड़ा ओवरबोर्ड चला गया;) –

+0

प्रश्न के वाक्यांश के तरीके से यह संदिग्ध है। –

0

मैं क्लासलोडर को विस्तारित करके और DefineClass का उपयोग करके कक्षा बना सकता हूं। लेकिन फिर बनाई गई कक्षा में मेरा विस्तारित क्लासलोडर इसके क्लासलोडर के रूप में है, जो विफलता का कारण बनता है जब मेरी कक्षा का कोड अन्य वर्गों को लोड करता है। संभवतः मैं अपने क्लासलोडर को सही तरीके से सब कुछ देने के लिए इसे प्राप्त कर सकता हूं, लेकिन यह स्पष्ट नहीं है कि यह अधिकार कैसे प्राप्त किया जाए।

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