1. 静态代理
- Subject 抽象主题(接口)
- RealSubject 具体主题(目标对象)
- Proxy(代理对象)
- 缺点
- 目标对象和代理对象都实现接口的所有方法,随着接口方法的改变而改变
- 一个代理类只能代理一个目标对象
2. 动态代理
- JDK动态代理 – 只能代理实现了接口的类
- CGLIB
3. JDK 动态代理
- 需要实现 InvocationHandler
public class JDKHandler implements InvocationHandler {
// 目标对象
private Object target;
// 通过构造器传入目标对象
public JDKHandler(Object target) {
this.target = target;
}
// Creating Proxy Instance
public Object getProxy() {
Object obj = Proxy.newProxyInstance(this.getClass().getClassLoader(), target.getClass().getInterfaces(), this);
System.out.println("getProxy: " + obj.getClass().getName());
return obj;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("==== before ====");
// 调用目标对象中的方法
Object object = method.invoke(target, args);
System.out.println("==== after ====");
return object;
}
}
3.2 源码分析
获取代理对象
public static Object newProxyInstance(ClassLoader loader, Class>[] interfaces, InvocationHandler h)
throws IllegalArgumentException
- loader: 类加载器,定义了当前由哪个类加载器来生成代理对象
- interfaces: 接口数组,代理类实现的接口列表
- target.getClass().getInterfaces(): 目标对象的接口数组
- h: InvocationHandler 接口(传入InvocationHandler 接口的实现类)
4. CGLIB
public class CglibInterceptor implements MethodInterceptor {
private Object target;
public CglibInterceptor(Object target) {
this.target = target;
}
public Object getProxy() {
// 通过 Enhancer 对象中的 create() 生成一个类,用于生成代理对象
// Enhancer 字节码增强器,用于生成代理对象
Enhancer enhancer = new Enhancer();
// 设置父类(将目标类作为代理类的父类)
enhancer.setSuperclass(target.getClass());
// 设置拦截器 回调对象为本身对象
enhancer.setCallback(this);
// 生成代理类对象,并返回线调用者
// return enhancer.create();
Object obj = enhancer.create();
System.out.println("getProxy: " + obj.getClass().getName());
return obj;
}
/**
* 拦截器
* 1. 目标对象的方法调用
* 2. 行为增强
*/
@Override
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
System.out.println("======before======");
Object object = methodProxy.invoke(target, objects);
System.out.println("=====after=====");
return object;
}
【信息由网络或者个人提供,如有涉及版权请联系COOY资源网邮箱处理】
© 版权声明
部分内容为互联网分享,若有侵权请联系站长删除。
THE END
暂无评论内容