加入收藏 | 设为首页 | 会员中心 | 我要投稿 淮南站长网 (https://www.0554zz.cn/)- 管理运维、图像技术、智能营销、专属主机、5G!
当前位置: 首页 > 站长资讯 > 动态 > 正文

7月份中国移动数据出炉

发布时间:2021-02-15 16:27:53 所属栏目:动态 来源:互联网
导读:我们关注点依旧放在可扩展性和可维护性上,Cglib 依旧符合「开闭原则」,如果小明需要小红代理购买红酒,该如何做呢?这里碍于篇幅原因,我不再将完整的代码贴出来了,可以自己试着手动实现一下,或者在心里有一个大概的实现思路即可。 我们来总结一下 CGLIB

我们关注点依旧放在可扩展性和可维护性上,Cglib 依旧符合「开闭原则」,如果小明需要小红代理购买红酒,该如何做呢?这里碍于篇幅原因,我不再将完整的代码贴出来了,可以自己试着手动实现一下,或者在心里有一个大概的实现思路即可。

我们来总结一下 CGLIB 动态代理:

(1)CGLIB 的使用方法:

  • 代理工厂需要「实现 MethodInterceptor 接口」,并重写方法,「内部关联真实对象」,控制第三者对真实对象的访问;代理工厂内部暴露 getInstance(Object realObject) 方法,「用于从代理工厂中获取一个代理对象实例」。
  • Enhancer 类用于从代理工厂中实例化一个代理对象,给调用者提供代理服务。

JDK Proxy 和 CGLIB 的对比

(2)仔细对比一下,JDK Proxy 和 CGLIB 具有相似之处:

 

ntercept() 方法涉及到 4 个参数:

  • Object o:被代理对象
  • Method method:被拦截的方法
  • Object[] objects:被拦截方法的所有入参值
  • MethodProxy methodProxy:方法代理,用于调用原始的方法

对于 methodProxy 参数调用的方法,在其内部有两种选择:invoke() 和 invokeSuper() ,二者的区别不在本文展开说明,感兴趣的读者可以参考本篇文章:Cglib源码分析 invoke和invokeSuper的差别

在 getInstance() 方法中,利用 Enhancer 类实例化代理对象(可以看作是小红)返回给调用者小明,即可完成代理操作。

 

到了这里,源码分析完了,是不是感觉被掏空了?哈哈哈哈,其实我当时也有这种感觉,不过现在你也感觉到,JDK 的动态代理其实并不是特别复杂吧(只要你有毅力)

CGLIB

CGLIB(Code generation Library) 不是 JDK 自带的动态代理,它需要导入第三方依赖,它是一个字节码生成类库,能够在运行时动态生成代理类对 「Java类 和 Java接口」 扩展。

CGLIB不仅能够为 Java接口 做代理,而且「能够为普通的 Java类 做代理」,而 JDK Proxy 「只能为实现了接口」的 Java类 做代理,所以 CGLIB 为 Java 的代理做了很好的扩展。「如果需要代理的类没有实现接口,可以选择 Cglib 作为实现动态代理的工具。」

废话太多,一句话概括:「CGLIB 可以代理没有实现接口的 Java 类」

下面我们来学习它的使用方法,以「小明找代理工厂买法国香水」这个故事背景为例子。

(1)导入依赖


(编辑:淮南站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读