目录
说一下你对代理模式的理解吧
代理的核心就是通过代理对象去访问实际的目标对象,比如我们生活中的租房问题,其中的中介就是代理模式的体现。代理类不仅能够实现目标对象,而且能添加一些额外的功能,比如在目标方法前后添加一些方法,这就类似于AOP的作用。Java中的代理模式主要分为静态代理和动态代理两大类。
静态代理:静态代理中对目标方法的增强都需要手动完成,是非常不灵活的,如果接口一旦新增方法,目标对象和代理对象都需要进行修改。静态代理还有一个缺点就是,在程序编译过程中就已经把接口,实现类,代理类这些都变成一个实际的.class文件,这就导致需要对每一个代理对象创建一个代理,当需要的代理对象很多的时候,就严重降低了代码的可维护性。因此就产生了动态代理,动态代理更加灵活。
动态代理:动态代理的代码不是写在代码里面,而是运行过程中产生,Java提供了两种实现动态代理的方法,分别是基于JDK的动态代理和Cglib动态代理,
动态代理的优点就是在运行时创建代理类,因此只需要写一个动态代理类就好。但是动态代理还有一个缺点就是只能代理接口,不能代理类吗?
说一下jdk动态代理是这么实现的吧
Jdk动态代理的核心接口是InvocationHandler ,和Proxy 类,Proxy类中使用频率最高的方法是newProxyInstance();这个方法主要是在程序运行期间生成代理类。
实现动态代理还需要实现一个接口:InvocationHandler ,来自定义处理逻辑 当我们动态代理调用一个方法的时候,这个方法的调用就会被转发到实现InvocationHandler 接口类的invoke 方法来调用。
如果又想代理类又想代理接口的话?
jdk动态代理就不合适了,就会用到cglib动态代理。
既然动态代理被你说的这么牛,那你平常工作中有使用到吗?
我日常开发中几乎是没有使用动态代理类的,但是我们使用的spring框架中的AOP就用到了动态代理,AOP通过动态代理实现了对方法的加强,比如最常见的前置通知和后置通知。