जैसा कि अन्य ने पहले से ही सही कहा है, एक डायनामिक प्रॉक्सी का उपयोग करें। यहां एक उदाहरण दिया गया है।
यह कक्षा "हैमर लिस्टर" इंटरफ़ेस में घोषित विधियों के आमंत्रण को रोकने के लिए डायनामिक प्रॉक्सी का उपयोग करती है। यह कुछ लॉगिंग करता है और फिर "असली" हैमर लिस्टनर कार्यान्वयन के लिए प्रतिनिधि करता है (हां, वही बात एओपी के साथ की जा सकती है)।
प्रॉक्सी इंस्टेंटेशन के लिए नई इंस्टेंस विधि देखें (ध्यान दें कि आपको प्रॉक्सी को कार्यान्वित करने वाले इंटरफ़ेस में पारित करने की आवश्यकता है - एक प्रॉक्सी एकाधिक इंटरफ़ेस को कार्यान्वित कर सकता है)।
प्रॉक्सी उपकरण पर इंटरफेस पर सभी विधि आमंत्रण "InvokeHandler" इंटरफ़ेस में घोषित "invoke" विधि को कॉल के रूप में समाप्त हो जाएगा। सभी प्रॉक्सी हैंडलर को इस इंटरफेस को लागू करना होगा।
import java.lang.reflect.*;
/**
* Decorates a HammerListener instance, adding BEFORE/AFTER
* log messages around all methods exposed in the HammerListener interface.
*/
public class HammerListenerDecorator implements InvocationHandler {
private final HammerListener delegate;
static HammerListener newInstance(HammerListener delegate) {
ClassLoader cl = Thread.currentThread().getContextClassLoader();
return (HammerListener)Proxy.newProxyInstance(cl, new Class[]{HammerListener.class},
new HammerListenerDecorator(delegate));
}
private HammerListenerDecorator(HammerListener delegate) {
this.delegate = delegate;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
logger.info("BEFORE " + method.getName() + " {{{" + argsToString(args) + "}}}");
Object rtn = method.invoke(delegate, args);
logger.info("AFTER " + method.getName());
return rtn;
}
private String argsToString(Object[] args) {
StringBuilder sb = new StringBuilder();
for (Object o : args) {
sb.append(String.valueOf(o)).append(" ");
}
return sb.toString();
}
}
@ killdash10: धन्यवाद, बहुत उपयोगी! – cibercitizen1
यह थोड़ी देर में मैंने देखा है सबसे आश्चर्यजनक बात है। –
"प्रॉक्सी लागू करने वाले इंटरफेस पर सभी विधि आमंत्रण" - तो, यदि आप किसी भी संभावित * विधि आमंत्रण को अवरुद्ध करना चाहते हैं तो उपयोगी नहीं है? – allquixotic