美文网首页
2018-10-21 java代理模式

2018-10-21 java代理模式

作者: LoveXiaer | 来源:发表于2018-10-21 21:06 被阅读0次

    关键字:代理模式,方法增强、方法拦截

    代理可以在不改动目标对象的基础上,增加其他额外的功能(扩展功能)。

    也就是在目标对象的逻辑上,加上一些其他的逻辑,组成了 整个代理对象的逻辑;

    代理分为:

    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

    相关文章

      网友评论

          本文标题:2018-10-21 java代理模式

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