关键字:代理模式,方法增强、方法拦截
代理可以在不改动目标对象的基础上,增加其他额外的功能(扩展功能)。
也就是在目标对象的逻辑上,加上一些其他的逻辑,组成了 整个代理对象的逻辑;
代理分为:
1、静态代理
代理对象proxy,与目标对象,需要有相同的接口实现或者继承相同父类,以便通过外部传入目标对象,代理对象proxy拿到目标对象的接口,然后在其对接口的实现中,再次扩展自己的一些东西;
也就是代理对象实现与目标对象相同的接口,但在实现接口中加入扩展的东西+目标对象的实现;
因为代理对象需要实现目标对象相同的接口,如果目标对象的接口增减,代理对象的接口也需要维护;
2、动态代理(jdk代理)
目标对象要有接口的实现,但代理对象不需要实现接口,通过JDK动态生成代理对象proxy(需要我们指定创建代理对象/目标对象实现的接口的类型);
主要是通过Proxy.newProxyInstance(目标对象的classLoader, 目标对象的接口, InvocationHandler对象),在InvocationHandler中写你的代理对象的实现逻,也是静态代理中写的逻辑搬到了这里。
这种模式较静态代理更方便维护目标对象接口的变化;
3、cglib代理
JDK的动态代理机制只能代理实现了接口的类,而不能实现接口的类就不能实现JDK的动态代理,cglib是针对类来实现代理的,他的原理是对指定的目标类生成一个子类,并覆盖其中方法实现增强,但因为采用的是继承,所以不能对final修饰的类进行代理。 另外,目标对象的方法如果为final/static,那么就不会被拦截,即不会执行目标对象额外的业务方法,这种需要注意。
Cglib代理,也叫作子类代理,它是在内存中构建一个子类对象从而实现对目标对象功能的扩展;
但是 这个cglib不支持android平台,在android中使用不了;但github上有一个模仿cglib的写法做了一部分适配;
https://github.com/zhangke3016/MethodInterceptProxy
cglib使用场景:https://www.jianshu.com/p/08203d371f1c
java代理:https://www.cnblogs.com/linzhong/p/7234051.html