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