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资源网邮箱处理】
© 版权声明
本平台(www.cooy.cn)的一切软件、教程及内容信息仅限用于学习和研究,付费仅为收集整理归类费用;
不得将上述内容用于商业或者非法用途,否则一切后果用户自行承担负责。本平台资源、内容、信息均来自来自用户上传,版权争议及其他问题与本平台无关。
您必须在下载后的24个小时之内从您的电脑或手机中彻底删除上述下载内容,如果您喜欢该程序或内容,请支持正版以获取更好的服务。我们非常重视版权问题,如有侵权请发送邮件至下方邮件(655465@qq.com),敬请谅解!
如发现违法违规内容,请联系下方邮箱举报,我们收到后将会第一时间处理。
THE END
    





暂无评论内容