简述动态代理与静态代理

2021.01.12 13:01 11
阅读约 5 分钟

什么是代理

给某一个对象提供一个代理,以此来控制对这个对象的访问。

委托类和代理类有着共同的父类或者是父接口,这样的话,在任何使用委托类对象的地方都能够用代理对象来替代。

代理类负责请求的预处理、过滤、把请求分派给委托类处理、以及委托类执行完请求后的后续处理。

① 静态代理

由程序员创建代理类或特定工具自动生成源代码再对其编译。在程序运行前代理类的.class文件就已经存在了。

静态代理让调用者不用再直接持有操作者的引用,而是将一切操作交由代理者去完成。但是静态代理也有它的局限性:

  1. 如果需要增加一个需要代理的方法,代理者的代码也必须改动进而适配新的操作;
  2. 如果需要代理者代理另外一个操作者,同样需要对代理者进行扩展并且更加麻烦。

② 动态代理

在程序运行时运用反射机制动态创建而成,动态代理能够在自定义调用处理器统一处理委托类的方法,而不需要去一个个进行编写。

但是,动态代理也存在这个一个很明显的缺点。

动态代理只可以代理基于接口的类,而不能去代理没有接口的委托类。

一个栗子

public <T> T create(final Class<?> interfaceClass, final String serviceVersion) {
        // 使用 CGLIB 动态代理机制
        Enhancer enhancer = new Enhancer();
        enhancer.setClassLoader(interfaceClass.getClassLoader());
        enhancer.setSuperclass(interfaceClass);
        enhancer.setCallback(new MethodInterceptor() {
            /**
             * @param o 被代理的对象(需要增强的对象)
             * @param method 被拦截的方法(需要增强的方法)
             * @param args 方法入参
             * @param methodProxy 用于调用原始方法
             * @return
             * @throws Throwable
             */
            @Override
            public Object intercept(Object o, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
               ...
            }
        });

        return (T) enhancer.create();
    }

 

字数:1221 发布于 1 个月前
Copyright 2018-2021 Siques