मैं इस दृष्टिकोण की योग्यताओं पर चर्चा नहीं करना चाहता, बस यह संभव है। मेरा मानना है कि जवाब "नहीं" है। लेकिन शायद कोई मुझे आश्चर्यचकित करेगा!जावा में बंदर पैच करना संभव है?
कल्पना कीजिए कि आपके पास कोर विजेट क्लास है। इसमें एक विधि calculateHeight()
है, जो ऊंचाई को लौटाती है। ऊंचाई बहुत बड़ी है - इसका परिणाम बटन (कहें) में बहुत बड़ा है। आप अपना खुद का नाइसविड्ज बनाने के लिए डिफॉल्ट विजिट का विस्तार कर सकते हैं, और एक अच्छा आकार वापस करने के लिए अपने calculateHeight()
को कार्यान्वित कर सकते हैं।
अब लाइब्रेरी क्लास विंडोडिस्प्लेफ़ैक्टरी, एक जटिल जटिल विधि में डिफ़ॉल्ट विजिट को तुरंत चालू करता है। आप इसे अपने नाइसविड्ज का उपयोग करना चाहते हैं। फैक्ट्री क्लास की विधि इस तरह दिखती है:
public IWidget createView(Component parent) {
DefaultWidget widget = new DefaultWidget(CONSTS.BLUE, CONSTS.SIZE_STUPIDLY);
// bunch of ifs ...
SomeOtherWidget bla = new SomeOtherWidget(widget);
SomeResultWidget result = new SomeResultWidget(parent);
SomeListener listener = new SomeListener(parent, widget, flags);
// more widget creation and voodoo here
return result;
}
यह सौदा है। परिणाम में अन्य ऑब्जेक्ट्स के पदानुक्रम के भीतर डिफ़ॉल्ट Widget गहराई है। प्रश्न - इस फैक्ट्री विधि को अपने नाइसविड्ज का उपयोग करने के लिए कैसे प्राप्त करें? या कम से कम अपना खुद का calculateHeight()
प्राप्त करें। आदर्श रूप में, मैं बंदर DefaultWidget पैच ताकि उसके calculateHeight सही काम किया करने में सक्षम होना चाहते हैं ...
public class MyWindowDisplayFactory {
public IWidget createView(Component parent) {
DefaultWidget.class.setMethod("calculateHeight", myCalculateHeight);
return super.createView(parent);
}
}
कौन है जो मैं अजगर, रूबी, आदि में कर सकता है मैं का आविष्कार किया गया है नाम setMethod()
हालांकि। अन्य विकल्प मेरे लिए खुले हैं:
- कॉपी करने और अपने ही वर्ग है कि कारखाने वर्ग
- से विरासत विजेट है कि बहुत बड़ा
हैं के साथ जीने में createView()
विधि के कोड को पेस्ट फैक्ट्री क्लास को बदला नहीं जा सकता - यह कोर प्लेटफार्म एपीआई का हिस्सा है। मैंने विजेट पर पहुंचने के लिए लौटाए गए परिणाम पर प्रतिबिंबित करने की कोशिश की (अंत में) जोड़ा गया, लेकिन यह कई विजेट-परतों को नीचे चला गया है और कहीं और यह अन्य सामानों को शुरू करने के लिए उपयोग किया जाता है, जिससे अजीब दुष्प्रभाव होते हैं।
कोई विचार? मेरा समाधान अब तक कॉपी-पेस्ट जॉब है, लेकिन यह एक पुलिस है जिसके लिए प्लेटफार्म के नए संस्करणों में अपग्रेड करते समय पैरेंट फैक्ट्री क्लास में बदलावों की ट्रैकिंग की आवश्यकता होती है, और मुझे अन्य विकल्पों को सुनने में दिलचस्पी होगी।
अच्छा और संभवतः निकटतम वास्तविक समाधान लगता है। शायद स्प्रिंग निर्भरता जोड़ने के लिए थोड़ी अधिक मात्रा में जहां इस फिक्सअप के लिए ऐप में कोई भी मौजूद नहीं था। एक कस्टम क्लास लोडर ग्रहण आरसीपी के साथ अच्छी तरह से खेल नहीं सकता है, जिसका मैं भी उपयोग करता हूं ... – richq
आपको एओपी करने के लिए वसंत की आवश्यकता नहीं है, बस AspectJ प्राप्त करें। एक ग्रहण प्लगइन भी है: http://www.eclipse.org/aspectj/ –