JDK
接口
public interface Subject {
String get(String id);
}
实现类
public class OrderSubject implements Subject{
@Override
public String get(String id) {
return id;
}
}
代理类
@Log4j
public class OrderProxySubject implements InvocationHandler {
private final Subject order;
public OrderProxySubject(Subject order) {
this.order = order;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
before();
Object res = method.invoke(order, args);
log.info("invoke");
after();
return res;
}
public void before() {
log.info("before");
}
public void after() {
log.info("after");
}
public Subject getProxyInstance() {
return (Subject) Proxy.newProxyInstance(order.getClass().getClassLoader(), order.getClass().getInterfaces(), this);
}
}
单元测试
@Log4j
class OrderProxySubjectTest {
@Test
void invoke() {
OrderSubject orderSubject = new OrderSubject();
OrderProxySubject orderProxySubject = new OrderProxySubject(orderSubject);
Subject proxyInstance = orderProxySubject.getProxyInstance();
String res = proxyInstance.get("123");
log.info("结果 -> " + res);
}
}
执行结果
[INFO ] 2021-02-02 15:20:03,745(0) --> [main] proxy.OrderProxySubject.before(OrderProxySubject.java:27): before
[INFO ] 2021-02-02 15:20:03,752(7) --> [main] proxy.OrderProxySubject.invoke(OrderProxySubject.java:21): invoke
[INFO ] 2021-02-02 15:20:03,753(8) --> [main] proxy.OrderProxySubject.after(OrderProxySubject.java:31): after
[INFO ] 2021-02-02 15:20:03,754(9) --> [main] proxy.OrderProxySubjectTest.invoke(OrderProxySubjectTest.java:17): 结果 -> 123