यदि आपके पास उन तरीकों की घोषणा करने वाले इंटरफेस हैं जिन्हें आप कॉल लॉग करना चाहते हैं, तो आप जो चाहते हैं उसे प्राप्त करने के लिए मानक प्रॉक्सी API का उपयोग कर सकते हैं।
प्रॉक्सी एपीआई आपको अपने वास्तविक कार्यान्वयन को एक नई, प्रॉक्सी क्लास में लपेटने की अनुमति देगा, जो कॉल लॉग करेगा, और अग्रेषित करने के लिए कॉल अग्रेषित करेगा। आपको बस एक InvocationHandler
लागू करना है जो लॉगिंग और अग्रेषण करता है।
उदाहरण के लिए,
interface Calculator {
int add(int a, int b);
}
class CalculatorImpl implements Calculator {
@Override public int add(int a, int b) { return a+b; }
}
class LoggingInvocationHandler implements InvocationHandler {
private final Object delegate;
public LoggingInvocationHandler(final Object delegate) {
this.delegate = delegate;
}
@Override invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("method: " + method + ", args: " + args);
return method.invoke(delegate, args);
}
}
class X {
public static void main(String... args) {
final Calculator calc = new CalculatorImpl();
final Calculator loggingCalc =
(Calculator) Proxy.newProxyInstance(X.class.getClassLoader(),
new Class[] {Calculator.class},
new LoggingInvocationHandler (calc));
loggingCalc.add(2, 3); // shall print to the screen
}
}
तुम भी आसानी से, बस InvocationHandler
में कोड बदलकर वापसी मूल्यों और अपवाद तरीकों द्वारा फेंका प्रवेश कर सकते हैं। इसके अलावा, उदाहरण के तौर पर आप System.out.println
की बजाय किसी भी लॉगिंग फ्रेमवर्क का उपयोग कर सकते हैं।
वापसी मूल्यों और अपवाद लॉग इन करने के लिए, आप की तरह कुछ कर सकता है:
@Override invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("method: " + method + ", args: " + args);
try {
final Object ret = method.invoke(delegate, args);
System.out.println("return: " + ret);
return ret;
} catch (Throwable t) {
System.out.println("thrown: " + t);
throw t;
}
}
स्रोत
2012-11-13 06:20:46
एओपी कोशिश करने लायक हो सकता है। – Nishant