专业的编程技术博客社区

网站首页 > 博客文章 正文

说一说JDK动态代理与CGLIB实现的区别

baijin 2024-09-04 02:02:58 博客文章 8 ℃ 0 评论

【死记硬背】

JDK动态代理与CGLIB动态代理是Java中两种实现动态代理的技术,但是它们在实现原理和使用方式上有一些区别:

JDK动态代理是基于接口的代理技术,要求目标类必须实现一个或多个接口。

CGLIB是基于集成的代理技术,可以代理普通的类,不需要目标实现接口。

【答案解析】

下面是它们之间的一些关键区别:

1 原理区别

JDK动态代理:基于Java的反射机制和java.lang.reflect.Proxy类实现。它要求目标对象必须实现一个接口。JDK动态代理通过在运行时创建一个实现了所有目标接口的新代理类来实现,这个代理类持有目标对象的引用,并在调用代理方法时转调目标方法,同时可以在调用前后插入自定义逻辑(如日志记录、权限校验等)。

CGLIB动态代理:CGLIB是一个强大的高性能的代码生成库,它可以在运行期扩展Java类与实现Java接口。CGLIB通过字节码技术为一个目标类生成子类,并在子类中加入拦截器来实现方法的拦截和增强。这意味着CGLIB可以代理没有实现接口的类。

2 接口与类的适用性

JDK动态代理:仅能代理实现了接口的类。如果目标类没有实现任何接口,JDK动态代理就无法应用。

CGLIB动态代理:既可以代理实现接口的类,也可以代理未实现接口的普通类。这是因为它是通过创建目标类的子类来实现代理的。

3 性能差异

由于JDK动态代理依赖于反射调用,而反射操作在Java中相对较为耗时,因此在大量调用的情况下,JDK动态代理的性能可能不如CGLIB。CGLIB通过生成字节码来实现代理,虽然初始化时可能稍慢,但一旦类生成完成,调用速度较快。

小结

JDK动态代理适用于基于接口的代理需求,而CGLIB适用于代理普通类的需求。选择使用哪种代理方式取决于具体的需求。如果目标类已经实现了接口且需要基于接口进行代理,可以选择JDK动态代理。而如果目标类没有实现接口,或者需要代理普通类的方法,可以选择CGLIB。

【温馨提示】

点赞+收藏文章,关注我并私信回复【面试题解析】,即可100%免费领取楼主的所有面试题资料!

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表