JDK

JDK 动态代理通过回调拦截方式,通过反射获取模板接口名字、内部方法以及参数,再原来的接口上修改,拼接,产生一个新的java代理对象(类似于mybatis的反序列化代码过程)

1.拼接java源代码

2.编译为class文件

3.类加载器加载新的class到内存中

4.通过反射执行方法(就是在invoke()那个方法)

重点:生成的代理对象不能直接调用被代理对象的方法,而是通过反射,等于说每次都得用反射调用一次,所以执行效率不高。

Cglib

Cglib动态代理采用继承方式,底层基于asm字节码技术参数一个新的java代理对象

1.生成class文件

2.读取class文件到内存中

3.采用fastclass索引机制执行方法(关键在于invoke()那个方法)

重点:Cglib代理实际上是通过继承,也就是生成一个继承被代理对象的类,编译成class文件时还会额外生成一个fastclass文件,该文件记录各个method的class索引(类名+方法名+参数),当执行某个方法时,通过计算索引,定位到具体的方法,代理对象执行该方法,然后super调用父类(执行了被代理对象的方法)。

生成代理对象时通过fastclass索引机制直接定位到被代理对象的class文件,从而实现反复调用,等于说是class复用,每次都是直接拿被代理对象的class内容执行的。

对比

都是需要再原来的被代理对象基础上加额外代码。前者的invoke内部通过反射,后者通过fastclass索引机制,后者实现执行效率更高(高于反射数倍)。

从最终生成的被代理对象来看:

jdk通过拼接,内部只需要一个method.invoke()就可以达到目标。

cglib则需要将被代理对象(可以是多个)的class文件通过集合形式定位好,之后先执行增强代码,之后通过回调对象来执行目标对象。

为何框架大多数通过接口形式?

接口形式结合多态更加方便,而且接口本身没有什么实质性代码,jdk 动态代理生成的对象,实际上执行时没有“执行被代理方法”这一步骤,而jdk生成class速度比较快(相对cglib更加轻量级),随着jdk的版本变化对反射这一块进行了优化,jdk更加快捷。

java 动态代理 jdk为何比cglib效率低 原理总结相关推荐

  1. Spring AOP【AOP的基本实现与动态代理JDK Proxy 和 CGLIB区别】

    Spring AOP[AOP的基本实现与动态代理JDK Proxy 和 CGLIB区别]

  2. java动态代理(JDK和cglib)详解

    JAVA的动态代理  代理模式  代理模式是常用的java设计模式,他的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息.过滤消息.把消息转发给委托类,以及事后处理消息等.代理类与委 ...

  3. JAVA 进阶篇 动态代理 JDK动态代理和CGlib动态代理

    JDK动态代理和CGlib动态代理 JDK动态代理: 利用反射机制生成一个实现代理接口的匿名类,在调用具体方法前调用InvokeHandler来处理. CGlib动态代理: 利用ASM(开源的Java ...

  4. java动态代理(JDK和cglib)

    2019独角兽企业重金招聘Python工程师标准>>> JAVA的动态代理  代理模式  代理模式是常用的java设计模式,他的特征是代理类与委托类有同样的接口,代理类主要负责为委托 ...

  5. Java动态代理的两种实现方法:JDK动态代理和CGLIB动态代理

    Java动态代理的两种实现方法:JDK动态代理和CGLIB动态代理 代理模式 JDK动态代理 CGLIB动态代理 代理模式 代理模式是23种设计模式的一种,指一个对象A通过持有另一个对象B,可以具有B ...

  6. Java两种动态代理JDK动态代理和CGLIB动态代理

    目录 代理模式 JDK动态代理 cglib动态代理 测试 代理模式 代理模式是23种设计模式的一种,他是指一个对象A通过持有另一个对象B,可以具有B同样的行为的模式.为了对外开放协议,B往往实现了一个 ...

  7. Java动态代理之JDK实现和CGlib实现

    一:代理模式(静态代理) 代理模式是常用设计模式的一种,我们在软件设计时常用的代理一般是指静态代理,也就是在代码中显式指定的代理. 静态代理由 业务实现类.业务代理类 两部分组成.业务实现类 负责实现 ...

  8. Java 静态代理、Java动态代理、CGLIB动态代理

    为什么80%的码农都做不了架构师?>>>    Java 的代理就是客户类不再直接和委托类打交道, 而是通过一个中间层来访问, 这个中间层就是代理.为啥要这样呢, 是因为使用代理有 ...

  9. 动态代理(JDK动态代理和CGLIB代理)

    一.什么是代理? 代理是一种常用的设计模式,其目的就是为其他对象提供一个代理以控制对某个对象的访问.代理类负责为委托类预处理消息,过滤消息并转发消息,以及进行消息被委托类执行后的后续处理. 二 Jav ...

  10. 设计模式之代理模式(静态代理、Java动态代理、Cglib动态代理)

    代理模式的定义:由于某些原因需要给某对象提供一个代理以控制对该对象的访问.这时,访问对象不适合或者不能直接引用目标对象,代理对象作为访问对象和目标对象之间的中介. 提醒:动态代理中涉及到以前的一些知识 ...

最新文章

  1. Flex Socket 跨域问题的解决办法
  2. python编程培训多少钱-线下python培训要多少钱?
  3. grpc在java中使用
  4. Java自定义Exception
  5. 如何绘制caffe网络训练曲线
  6. 转android项目开发 工作日志 2011.10.8--bundle类使用
  7. 什么是Spring Boot?
  8. [003]容器和动态数组的使用
  9. cnn stride and padding_彻底搞懂CNN中的卷积和反卷积
  10. Android NDK调试出错Unknown Application ABI, Unable to detect application ABI#39;s的解决方式...
  11. 实现一个简易版的微博,包含 client 和 server 两部分,并实现四个基础功能:关注、取关、发微博、获取用户微博列表
  12. python如何执行代码漏洞_命令执行与代码执行漏洞原理
  13. Hadoop 2.4.1 设置问题小结【原创】
  14. find_element 和find_elements 的区别
  15. 51Nod-1050 循环数组最大段和【最大子段和+最小子段和+DP】
  16. 457.环形数组循环
  17. 使用CLion的C语言开发环境配置
  18. php error unexpected,PHP 错误 Parse error: syntax error, unexpected ‘[‘ in 解决办法
  19. 安卓篇-我自己的第一个安卓程序(附源码链接)
  20. 浅谈工程总承包项目WBS的重要性与创建方法

热门文章

  1. android listview 数据混乱,求解,listView里面嵌套listView数据显示混乱
  2. Mac OS开启黑暗模式
  3. 命令查询职责分离模式 CQRS Command Query Responsibility Segregation
  4. python多级目录import_Python之路---包和模块
  5. python 日志框架_按日期打印Python的Tornado框架中的日志的方法
  6. 使用shinydashboard编写高级UI页面(1)
  7. oracle删除导入库,oracle数据库删除和导入方法
  8. java中如何进入代码块_Java中的匿名代码块
  9. 使用DNSObserver检测DNS安全漏洞
  10. 能力提升综合题单 Part 8.9.1 最大流