2013-10-07 8 views
5

तो इस परियोजना के लिए मैं रनटाइम पर कक्षा का विस्तार करने की कोशिश कर रहा हूं। मैं क्या जानना चाहता हूं, क्या यह भी संभव है? यदि हां, तो मैं यह कैसे करूँगा? क्या इन चीजों के लिए वहां पुस्तकालय हैं?रनटाइम पर विस्तार कक्षा

+0

पृथ्वी पर आप ऐसा क्यों करना चाहते हैं? कृपया उपयोग के मामले को स्पष्ट करें। मुझे संदेह है कि यह संभव है। –

उत्तर

4

CGLib एक पुस्तकालय है जिसे आप ढूंढ रहे हैं। यह कक्षाओं को विस्तारित करने या रनटाइम में इंटरफेस को लागू करने में काफी शक्तिशाली है, इसलिए स्प्रिंग या हाइबरनेट जैसे कई लोकप्रिय ढांचे का उपयोग करते हैं।

आप हालांकि आप शायद वांछित तर्क के साथ एक उपयोगी विधि इंटरसेप्टर साथ NoOp कॉलबैक की जगह लेंगे तरह

public Object createProxy(Class targetClass) { 
    Enhancer enhancer = new Enhancer(); 
    enhancer.setSuperclass(targetClass); 
    enhancer.setCallback(NoOp.INSTANCE); 
    return enhancer.create(); 
    } 

कोड के साथ वर्ग एक्सटेंशन बना सकते हैं।

+0

बहुत बढ़िया, धन्यवाद! – PaulBGD

1

हां, रनटाइम पर कक्षा का विस्तार करना संभव है। एक लाइब्रेरी आज़माएं जो रनटाइम पर बाइटकोड को संशोधित करने में सक्षम है जैसे उदा। javassist या ASM

0

उत्तर "कक्षा का विस्तार" के साथ आपका क्या मतलब है इस पर निर्भर करता है। जावा "विस्तार" का मतलब है कि एक और वर्ग घोषित करना जो पहले को बढ़ाता है (उप-वर्ग है)। इसलिए यदि आप दिए गए वर्ग का उप-वर्ग बनाना चाहते हैं, तो यह संभव है - बस उप-वर्ग का प्रतिनिधित्व करने वाली बाइट सरणी तैयार करें और उसे कक्षा लोडर को पास करें।

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

+0

मैं बस गतिशील रूप से चुनने के लिए देख रहा था कि कौन सी कक्षा का विस्तार करना है (वर्ग के वर्गपंथ लगातार बदलते हैं)। – PaulBGD

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