动态代理

Java 的动态代理是通过 java.lang.reflect 包下的 Proxy 类和 InvocationHandler 接口实现的。大致逻辑如下图所示:
proxy.svg
其中,用户通过 Proxy 对象调用 interface 声明的方法,但每次调用都会转发给 InvocationHandlerinvoke() 方法处理。即 interface 声明方法,Proxy 处理交互, InvocationHandler 负责执行

动态代理的意义在于实现了调用者与实现者的解耦,一方面使得调用者不必关于具体的实现逻辑,典型例子是 RPC 调用;另一方面也让我们可以在方法执行前后添加某些处理,典型例子是 AOP 编程。

示例代码

Java 动态代理的比较简单,且编写模板固定,下面给出了一个简单的示例:

  1. // 定义了方法
  2. interface Greeting {
  3. void sayHello();
  4. }
  5. class GreetingImpl implements Greeting {
  6. @Override
  7. public void sayHello() {
  8. System.out.println("Hello");
  9. }
  10. }
  11. // 负责处理调用
  12. class InvocationHandlerImpl implements InvocationHandler {
  13. private Object target;
  14. public InvocationHandlerImpl(Object target) {
  15. this.target = target;
  16. }
  17. @Override
  18. public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
  19. return method.invoke(target, args);
  20. }
  21. }
  22. public class DynamicProxy {
  23. public static void main(String[] args) {
  24. Greeting greeting = new GreetingImpl();
  25. InvocationHandler handler = new InvocationHandlerImpl(greeting);
  26. ClassLoader classLoader = GreetingImpl.class.getClassLoader()
  27. Class<?>[] interfaces = {Greeting.class};
  28. // 与用户交互,提供调用
  29. Greeting proxy = (Greeting) Proxy.newProxyInstance(classLoader, interfaces, handler);
  30. proxy.sayHello();
  31. }
  32. }