Android 设计模式

设计模式之代理模式

2023-02-07  本文已影响0人  Tinyspot

1. 静态代理

2. 动态代理

3. JDK 动态代理

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

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;
    }
上一篇 下一篇

猜你喜欢

热点阅读