तो, मुझे पता है इसका जवाब शायद है "यह मुश्किल है", लेकिन:जावा: रनटाइम पर प्रकार के नए कार्यान्वयन का निर्माण करें?
मैं एक अजीब विचार मिल गया है, और अगर यह जावा में की तरह एक विधि बनाने के लिए संभव है सोच रहा था:
<T> T wrapInterface (Class<T> interfaceClass, T wrappedObject) {
if (mClass.isInterface()) {
//create a new implementation of interfaceClass that, in each method,
//does some action before delegating to wrappedObject
return thatImplementation;
}
}
तो मूल रूप से, यदि मेरे इंटरफ़ेस फू ने एक विधि foo() को परिभाषित किया है, तो मैं इस विधि को इस तरह की एक नई कक्षा बनाने के लिए चाहता हूं, जिसने उस वर्ग का एक उदाहरण बनाया है जिसे wrappedObject को कन्स्ट्रक्टर पैरामीटर के रूप में बनाया गया है, और फिर इसे वापस कर दिया गया है :
public class GeneratedClass implements Foo {
private Foo wrapped;
public GeneratedClass (Foo wrapped) {
this.wrapped = wrapped;
}
@Override
public void foo() {
System.out.println("Calling Foo.foo() on wrapped object " +
wrapped.toString());
wrapped.foo();
}
}
आवेदन मैं सिर्फ कॉल लॉगिंग करने से अधिक जटिल हूं, लेकिन विचार के लिए लॉगिंग पर्याप्त है। मैं इसे बड़ी संख्या में इंटरफ़ेस प्रकारों के साथ करना चाहता हूं, यही कारण है कि मैं हाथ से सभी जेनरेटेड क्लास को नहीं लिखूंगा।
बोनस उन समाधानों के लिए इंगित करता है जिनके लिए अतिरिक्त भाषाई विशेषताओं (AspectJ या उन पंक्तियों के साथ कुछ लाने) की आवश्यकता नहीं होती है, और यदि मानक जेडीके पुस्तकालयों के साथ यह संभव है तो डबल-बोनस-पॉइंट्स की आवश्यकता नहीं होती है।
(मैं एक सटीक, compilable जवाब जरूरत नहीं है,। आदि उपकरण/पुस्तकालयों की सही सेट/कि मुझे ऐसा करते हैं जाएगा करने के लिए सिर्फ एक सूचक)
धन्यवाद!
परावर्तन ('java.lang.Class' सहित) एक अतिरिक्त भाषाई सुविधा है। –
आप [गतिशील प्रॉक्सी कक्षाएं] (http://docs.oracle.com/javase/7/docs/technotes/guides/reflection/proxy.html) में देखना चाहेंगे। –