前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >jvm源码解析(八)动态代理是如何实现的,JDK Proxy于CGLib有什么区别

jvm源码解析(八)动态代理是如何实现的,JDK Proxy于CGLib有什么区别

作者头像
JathonKatu
发布2020-10-27 14:38:50
7020
发布2020-10-27 14:38:50
举报
文章被收录于专栏:JathonKatu

动态代理常用实现方式是反射,是一种行为方式,而反射或ASM只是它的一种实现手段

反射机制:

程序在运行期间可以访问、检测和修改其本身状态或行为的一种能力,使用反射我们可以调用任意一个类对象,以及类对象中包含的属性及方法

JDK Proxy和CGLib的区别

  • JDK Proxy是java语言自带的功能,无需通过加载第三方类实现
  • Java对JDK Proxy提供了稳定的支持,并且会持续的升级和更新JDK Proxy,例如Java8中JDK Proxy性能相比于之前版本提升了很多
  • JDK Proxy是通过拦截器+反射的方式实现的
  • JDK Proxy只能代理实现接口的类
  • JDK Proxy实现和调用起来都比较简单
  • CGLib是第三方提供的工具,基于ASM实现的,性能较高
  • CGLib无需通过接口来实现,它是通过实现子类的方式来完成调用的

常见问题:

考核你对JDK Proxy和CGLib的掌握程度

JDK Proxy的核心是实现InvocationHandler接口,来获得动态代理的能力

接口中只有一个invoke方法,InvocationHandler是动态代理的代理器,invoke方法是触发执行代理的方法。

CGLib使用前,先在pom.xml中加入依赖

代码语言:javascript
复制
<dependency>
   <groupId>cglib</groupId>
   <artifactId>cglib</artifactId>
   <version>3.3.0</version>
</dependency>

实现接口MethodInterceptor,接口中有一个intercept方法

CGLib和JDKProxy的实现方法比较类似,都是实现代理器的接口

再调用某一方法,实现动态代理

唯一不同:

CGLib在初始化被代理类时,是通过Enhancer对象把被代理对象设置为代理类的子类,来实现动态代理的功能,因此被代理类不能被设置为final

Lombok是通过反射实现的吗

属于Java的一个热门工具类

使用它可以有效的解决代码工程中那些繁琐又重复的代码(getter/setter,toString,equals,hashCode等方法)

在类上加@Data可以自动代理出上述的方法。

Lombok的实现和反射没有任何关系

反射是程序在运行期的一种自省(introspect)能力

Lombok的实现是在编译期完成的

Lombok是基于java1.6实现的JSR-269(Pluggable Annotation Processing API(插件式注解处理器))

编码器自定义注解处理器实现的

当Java将源码抽象成AST之后,Lombok会根据注解动态的修改AST增加新的代码,生成最终的源码

动态代理和静态代理有什么区别

静态代理其实就是事先写好代理类,可以手工编写,也可以工具生成

他的缺点是每个业务类都要有一个对应的代理类,不灵活,不方便,所以产生了动态代理

动态代理的使用场景有哪些

RPC框架的封装,AOP的实现,JDBC的链接等

Spring中的动态代理是通过什么方式实现的

同时使用了JDK Proxy和CGLib

当bean实现了接口的时候,默认使用JDK Proxy

没有的时候,默认使用CGLib

我们也可以强制使用CGLib

只需要在Spring配置中添加

<aop:aspectj-autoproxt proxy-target-class="true" />

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-06-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 JathonKatu 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档