美文网首页Android 设计模式
设计模式之代理模式

设计模式之代理模式

作者: Tinyspot | 来源:发表于2023-02-07 21:24 被阅读0次

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;
    }

相关文章

  • 设计模式之代理模式

    设计模式之代理模式 10分钟看懂动态代理设计模式(升级篇)-对这篇动态代理模式的思路整理 仿JDK实现动态代理逻辑...

  • 代理模式

    设计模式之代理模式 什么是代理模式? 指的事代理对象为其他对象提供代理以控制对被...

  • Java设计模式之代理模式

    Java设计模式之代理模式 代理模式 静态代理 动态代理 为什么需要代理 通过代理,我们能够不用知道委托人是谁,而...

  • Java代理模式之JDK动态代理

    了解什么是动态代理模式,可参考Java设计模式之代理模式 简介 JDK动态代理是java.lang.reflect...

  • 设计模式之代理模式2

    设计模式之代理模式运用 代理(Proxy)是一种设计模式,提供了对目标对象另外的访问方式;即通过代理对象访问目标对...

  • 设计模式之代理模式

    设计模式之代理模式 简介 代理模式是结构型设计模式。 当无法或不想直接访问某个对象或访问某个对象存在困难时可以通过...

  • 设计模式之代理模式

    title: 设计模式之代理模式date: 2018-08-15 20:25:42tags: 设计模式 笔记 Ja...

  • java设计模式之代理模式(静态代理)

      今天给大家分享的是java设计模式之代理模式中的静态代理模式,动态代理模式将在后面文章中给出。如有不足,敬请指...

  • Android 代理模式

    Android 设计模式系列文章 Android 23种设计模式 前言 代理模式可能是我们平时开发中最常见的模式之...

  • 设计模式之代理模式

    设计模式之代理模式 1.代理模式的定义 为其他对象提供一种代理以控制对这个对象的访问. 2.代理模式的使用场景 当...

网友评论

    本文标题:设计模式之代理模式

    本文链接:https://www.haomeiwen.com/subject/bjfxkdtx.html