संक्षेप में: 1. मेरे पास कुछ अंतिम वर्ग है जो मैं इसके लिए गतिशील प्रॉक्सी बनाना चाहता हूं। मैं यह कैसे कर सकता हूं? 2. क्या मैं मेथडहैंडल को विधि में परिवर्तित कर सकता हूं?मैं अंतिम कक्षा के लिए गतिशील प्रॉक्सी कैसे बना सकता हूं?
विवरण सबसे पहले, मेथडहैंडल को विधि में बदलने के लिए कोई एपीआई मौजूद है? Java.lang.invoke.MethodHandles में कुछ पसंद है
public MethodHandle unreflect(Method m) throws IllegalAccessException;
लेकिन विपरीत तरीका arrond?
मान लें कि मैं गतिशील java.lang.reflect.Method बनाना चाहता हूं। यह
public final
class Method extends AccessibleObject implements GenericDeclaration,
Member ;
तो जैसा कि defiend है, अगर मैं JDK गतिशील प्रॉक्सी का उपयोग करने मैं कुछ इंटरफेस का उपयोग करना चाहिए (उदाहरण के लिए सदस्य) चाहते हैं। यद्यपि वहाँ 2 मुख्य drawabacks। सबसे पहले, विधि जैसे
public Class<?>[] getParameterTypes();
और
public Class<?> getReturnType();
जैसे जब वे बड़े पैमाने पर इस्तेमाल कर रहे हैं, किसी भी इंटरफ़ेस का हिस्सा नहीं हैं।
दूसरा दोष यह है कि यह ड्रॉप-इन प्रतिस्थापन प्रदान करने में विफल रहता है। यही है, मैं java.lang.reflect.Method की अपेक्षा करने वाले कोड पर अपनी गतिशील प्रॉक्सी को पास नहीं कर सकता।
एक और तरीका CGLIB या जावासिस्ट का उपयोग करना है। AFAIK, CGLIB अंतिम कक्षा प्रॉक्सी नहीं कर सकता, है ना? जावासिस्ट प्रॉक्सी अंतिम कक्षा कर सकते हैं? मैं कक्षा से अंतिम पहचानकर्ता को कैसे हटा सकता हूं? AFAIL, Javvassist किसी भी तरह यह कर सकते हैं ...
क्या आप आखिरी विकल्प में अधिक विस्तार से व्याख्या कर सकते हैं? – piotrek
आप उपकरण एपीआई का उपयोग कर कक्षाओं को फिर से परिभाषित कर सकते हैं। कहें, एक वर्ग एक विधि foo परिभाषित करता है। आप विधि बार का नाम बदल सकते हैं और इसे अपनी नई विधि foo से कॉल कर सकते हैं जिसे आपने फिर से परिभाषित किया है –