Java 动态代理示例

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  
posted @ 2021-02-02 15:23  qianbuhan  阅读(79)  评论(0)    收藏  举报