java 动态代理
动态代理是一种运行时多态的处理方式.来看下面的例子可以直观的理解.
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
// 1. 定义接口
interface Subject {
void request();
}
// 2. 实现接口
class RealSubject implements Subject {
@Override
public void request() {
System.out.println("RealSubject: Handling request.");
}
}
// 3. 实现InvocationHandler
class DynamicProxyHandler implements InvocationHandler {
private final Object target;
public DynamicProxyHandler(Object target) {
this.target = target;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("Before method: " + method.getName());
Object result = method.invoke(target, args); // 调用真实对象的方法
System.out.println("After method: " + method.getName());
return result;
}
}
public class DynamicProxyExample {
public static void main(String[] args) {
// 4. 创建代理对象
RealSubject realSubject = new RealSubject();
Subject proxyInstance = (Subject) Proxy.newProxyInstance(
RealSubject.class.getClassLoader(), // 类加载器
new Class[]{Subject.class}, // 代理类实现的接口
new DynamicProxyHandler(realSubject) // InvocationHandler
);
// 调用代理对象的方法
proxyInstance.request();
}
}
输出结果:
Before method: request
RealSubject: Handling request.
After method: request
进行解释:创建一个对象的代理对象,通过代理对象来间接的调用对象的方法或是访问对象的属性,有利于运行时多态的实现.
其中,创建代理对象时传入的第三个参数是一个实现了InvocationHandler接口的类,其中重写了invoke方法.我们间接调用实际对象的方法时,就是通过反射传递给invoke方法来实现的.

浙公网安备 33010602011771号