2012-02-19 25 views
6

मैं Javassist करने के लिए एक नौसिखिया हूँ, और मैं पहले से ही कुछ इसे से संबंधित ट्यूटोरियल पढ़ा है।क्या हम जावासवादी का उपयोग कर मौजूदा वर्ग में एक गैर-आदिम क्षेत्र जोड़ सकते हैं?

क्योंकि मैं करने की ज़रूरत प्रत्येक विधि में कुछ बाईटकोड इंजेक्शन दर्ज करें या विधि से बाहर निकलने से पहले, और इस से कुछ आंकड़े मिलता है।

के माध्यम से ऑनलाइन javassit ट्यूटोरियल, मुझे लगता है कि हम एक मौजूदा वर्ग के लिए एक नए क्षेत्र बना सकते हैं:

CtClass point = ClassPool.getDefault().get("Point"); 
CtField f = new CtField(CtClass.intType, "z", point); 
point.addField(f); 

लेकिन CtField के प्रकार के केवल डिफ़ॉल्ट रूप से आदिम प्रकार हैं, हम एक नए क्षेत्र में जोड़ सकते हैं जिसका प्रकार गैर-आदिम है, उदाहरण के लिए, ऐरेलिस्ट?

मैं, मौजूदा वर्ग के लिए नई ArrayList क्षेत्र जोड़ सकते हैं के बाद से वर्ग java.util.ArrayList आयात नहीं करता है, यह त्रुटि संकलन का कारण होगा?

उत्तर

6

हाँ, आप गैर आदिम फ़ील्ड जोड़ सकते हैं। क्लासपूल के माध्यम से, आपको मैदान के लिए कक्षा में एक हैंडल प्राप्त करने की आवश्यकता है। ध्यान दें कि आप वर्ग के पूरी तरह से योग्य नाम का उपयोग करना चाहते आवश्यकता होगी:

CtClass arrListClazz = ClassPool.getDefault().get("java.util.ArrayList"); 
CtClass point = ClassPool.getDefault().get("Point"); 
CtField f = new CtField(arrListClazz, "someList", point); 
point.addField(f); 
+0

धन्यवाद, ऊपर कोड मतलब है कि हम बिंदु वर्ग के लिए नई ArrayList सदस्य someList जोड़ने के लिए, लेकिन बिंदु कक्षा में हम नहीं था 'कि java.util.ArrayList आयात नहीं करते, क्या यह संकलन त्रुटि का कारण बन जाएगा? – LifeOnCodes

+0

ठीक है, आप *** बाइटकोड *** जोड़ रहे हैं जो एक java.util.ArrayList फ़ील्ड का प्रतिनिधित्व करता है, वास्तविक अंग्रेजी भाषा स्ट्रिंग नहीं। आयात विवरण केवल संकलक निर्देश हैं जो संकलित कक्षा फ़ाइल में प्रकट नहीं होते हैं। जिस तरह से, क्लासपूल में कक्षाओं की खोज करते समय आपको पूरी तरह से योग्य नाम (एफक्यूएन) का उपयोग करने की आवश्यकता क्यों है। – Perception

+0

बहुत बहुत धन्यवाद, मैं देखता हूं। मुझे लगता है कि मुझे बाइटकोड का अध्ययन करने में कुछ समय बिताना चाहिए। एक और सवाल है, उम्मीद है कि आप मेरी मदद कर सकते हैं, यह संभव someList सदस्य एक सामान्य प्रकार, ArrayList someList की तरह होने के लिए है? – LifeOnCodes

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