代理模式
概述
结构
JDK 动态代理原理
代理类是程序在运行过程中动态的在内存中生成的类。代理类的结构可以通过阿里巴巴开源的 Java 诊断工具 ( Arthas【阿尔萨斯】) 来查看。
- 理解
在内存中会生成对应的代理类,该类继承了类 Proxy (内部包含一个 InvocationHandler 接口,在代理时我们会重写接口内的方法), 并且实现了对应的接口方法(例如 SellTicket),接口重写的方法则会调用 InvocationHandler 内的方法。
CGLIB 动态代理
public class MyProxyFactory implements MethodInterceptor {
private Object obj;
public Object getProxy(Object obj) {
this.obj = obj;
// 创建 Enhancer 对象,类似于 JDK 动态代理 Proxy 类
Enhancer enhancer = new Enhancer();
// 设置父类的字节码对象
enhancer.setSuperclass(obj.getClass());
// 设置回调函数
enhancer.setCallback(this);
// 创建代理对象
return enhancer.create();
}
@Override
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
System.out.println("Before print...");
Object ans = method.invoke(obj, objects);
System.out.println("after print...");
return ans;
}
}