动态代理
Java 的动态代理是通过 java.lang.reflect 包下的 Proxy 类和 InvocationHandler 接口实现的。大致逻辑如下图所示:
其中,用户通过 Proxy 对象调用 interface 声明的方法,但每次调用都会转发给 InvocationHandler 的 invoke() 方法处理。即 interface 声明方法,Proxy 处理交互, InvocationHandler 负责执行。
动态代理的意义在于实现了调用者与实现者的解耦,一方面使得调用者不必关于具体的实现逻辑,典型例子是 RPC 调用;另一方面也让我们可以在方法执行前后添加某些处理,典型例子是 AOP 编程。
示例代码
Java 动态代理的比较简单,且编写模板固定,下面给出了一个简单的示例:
// 定义了方法interface Greeting {void sayHello();}class GreetingImpl implements Greeting {@Overridepublic void sayHello() {System.out.println("Hello");}}// 负责处理调用class InvocationHandlerImpl implements InvocationHandler {private Object target;public InvocationHandlerImpl(Object target) {this.target = target;}@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {return method.invoke(target, args);}}public class DynamicProxy {public static void main(String[] args) {Greeting greeting = new GreetingImpl();InvocationHandler handler = new InvocationHandlerImpl(greeting);ClassLoader classLoader = GreetingImpl.class.getClassLoader()Class<?>[] interfaces = {Greeting.class};// 与用户交互,提供调用Greeting proxy = (Greeting) Proxy.newProxyInstance(classLoader, interfaces, handler);proxy.sayHello();}}
