Khi người khác đã nói chính xác, hãy sử dụng DynamicProxy. Đây là một ví dụ.
Lớp này sử dụng DynamicProxy để chặn các lời gọi của các phương thức được khai báo trong giao diện "HammerListener". Nó thực hiện một số đăng nhập và sau đó đại biểu để thực hiện "thực tế" HammerListener (có, điều tương tự có thể được thực hiện với AOP).
Xem phương pháp mớiInstance cho việc khởi tạo proxy (lưu ý rằng bạn cần truyền vào (các) giao diện mà proxy sẽ triển khai - proxy có thể triển khai nhiều giao diện).
Tất cả các lời gọi phương thức trên các giao diện mà proxy triển khai sẽ kết thúc dưới dạng cuộc gọi đến phương thức "gọi", được khai báo trong giao diện "InvocationHandler". Tất cả trình xử lý proxy phải triển khai giao diện này.
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: Cảm ơn, rất hữu ích! – cibercitizen1
Đây là điều tuyệt vời nhất tôi từng thấy trong một thời gian. –
"Tất cả các lời gọi phương thức trên các giao diện mà proxy thực hiện" - Vì vậy, không hữu ích nếu bạn muốn chặn * bất kỳ lời gọi phương thức nào có thể *, sau đó? – allquixotic