代理主要有JDK的代理以及CGLIB的代理

代理方式 实现 优点 缺点 特点
JDK静态代理 代理类与委托类实现同一接口,并且在代理类中需要硬编码接口 实现简单,容易理解 代理类需要硬编码接口,在实际应用中可能会导致重复编码,浪费存储空间并且效率很低 好像没啥特点
JDK动态代理 代理类与委托类实现同一接口,主要是通过代理类实现InvocationHandler并重写invoke方法来进行动态代理的,在invoke方法中将对方法进行增强处理 不需要硬编码接口,代码复用率高 只能够代理实现了接口的委托类 底层使用反射机制进行方法的调用
CGLIB动态代理 代理类将委托类作为自己的父类并为其中的非final委托方法创建两个方法,一个是与委托方法签名相同的方法,它在方法中会通过super调用委托方法;另一个是代理类独有的方法。在代理方法中,它会判断是否存在实现了MethodInterceptor接口的对象,若存在则将调用intercept方法对委托方法进行代理 可以在运行时对类或者是接口进行增强操作,且委托类无需实现接口 不能对final类以及final方法进行代理 底层将方法全部存入一个数组中,通过数组索引直接进行方法调用
 
作者:EakonZhao
链接:https://www.jianshu.com/p/9a61af393e41
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。
 
 
 至此,Cglib动态代理的原理我们就基本搞清楚了,代码细节有兴趣可以再研究下。最后我们总结一下JDK动态代理和Gglib动态代理的区别:
1.JDK动态代理是实现了被代理对象的接口,Cglib是继承了被代理对象。
JDK dynamic proxy implements the interface of the proxied object, while Cglib inherits the proxied object.
2.JDK和Cglib都是在运行期生成字节码,JDK是直接写Class字节码,Cglib使用ASM框架写Class字节码,Cglib代理实现更复杂,生成代理类比JDK效率低。 Both generate bytecode at runtime。While the JDK writes Class bytecodes directly, Cglib USES the ASM framework to write Class bytecodes。 The proxy implementation of Cglib is more complex。Generating proxies is inefficient compared to the JDK
 
3.JDK调用代理方法,是通过反射机制调用,Cglib是通过FastClass机制直接调用方法,Cglib执行效率更高。

JDK calls proxy methods through reflection mechanism, while Cglib calls methods directly through FastClass mechanism, which makes Cglib execution more efficient.

一篇JDK动态代理机制,主要讲解jdk动态代理源码解读的文章

https://www.jianshu.com/p/471c80a7e831

还有来自

某博的一系列博文

JDK代理:

Java动态代理InvocationHandler和Proxy学习笔记

https://blog.csdn.net/yaomingyang/article/details/80981004

Java中InvocationHandler接口中第一个参数proxy详解

https://blog.csdn.net/yaomingyang/article/details/81040390

最新文章

  1. fineui刷新父页面
  2. ce游戏内存修改器(Cheat Engine)
  3. DSS中间件介绍
  4. 转:纠结的Shim
  5. Tenth scrum meeting - 2015/11/4
  6. BI的核心价值[转]
  7. 在自定义的dwt文件中调用page_header.lbi和page_footer.lbi
  8. Use_Case
  9. 14.5.5 Deadlocks in InnoDB
  10. Problem A: 小火山的跳子游戏 多校训练2(小火山专场)(周期)
  11. 使用bootstrap响应式布局——手机屏幕中横向滚动显示标签页选项
  12. 20155303 2016-2017-2 《Java程序设计》第二周学习总结
  13. CSRF & CORS 的区别
  14. 12月中旬项目中出现的几个bug解决方法的思考
  15. 使用Java代码自定义Ribbon配置
  16. Asp.Net WebApi学习教程之增删改查
  17. C++11新特性之九——function、bind以及lamda表达式总结
  18. python2/3 发送https请求时,告警关闭方法
  19. 7.scala:继承
  20. [原创]Nexus5 移植OneStep

热门文章

  1. iNeuOS工业互联平台,WEB组态(iNeuView)集成图报组件,满足实时数据图形化展示的需求
  2. css两种常用的不定宽高的水平垂直居中方法,记住它,不再为样式发愁
  3. 笔记:html基础
  4. Spring Boot系列(四):Spring Boot源码解析
  5. 访问github太慢?我写了一个开源小工具一键变快
  6. 牛客网PAT练习场-有几个PAT
  7. 学习一下 JVM (二) -- 学习一下 JVM 中对象、String 相关知识
  8. 从零开始的SpringBoot项目 ( 三 ) 项目打包( jar包篇 )
  9. 前端ES6 一些面试题
  10. 构建docker私有仓库+k8s-pod应用