
课程咨询: 400-996-5531 / 投诉建议: 400-111-8989
认真做教育 专心促就业
动态代理是程序员在学习Java编程开发语言的时候需要重点掌握的一个编程知识点,而本文我们就通过案例分析来简单了解一下,Java编程动态代理的概念与用法。
动态代理的常用实现方式是反射。反射机制是指程序在运行期间可以访问、检测和修改其本身状态或行为的一种能力,使用反射我们可以调用任意一个类对象,以及类对象中包含的属性及方法。
但动态代理不止有反射一种实现方式,例如,动态代理可以通过CGLib来实现,而CGLib是基于ASM(一个Java字节码操作框架)而非反射实现的。简单来说,动态代理是一种行为方式,而反射或ASM只是它的一种实现手段而已。
JDKProxy和CGLib的区别主要体现在以下几个方面:
JDKProxy是Java语言自带的功能,无需通过加载三方类实现;
Java对JDKProxy提供了稳定的支持,并且会持续的升级和更新JDKProxy,例如Java8版本中的JDKProxy性能相比于之前版本提升了很多;
JDKProxy是通过拦截器加反射的方式实现的;
JDKProxy只能代理继承接口的类;
JDKProxy实现和调用起来比较简单;
CGLib是三方提供的工具,基于ASM实现的,性能比较高;
CGLib无需通过接口来实现,它是通过实现子类的方式来完成调用的。
当面试官问动态代理的时候,经常会问到它和静态代理的区别?静态代理其实就是事先写好代理类,可以手工编写也可以使用工具生成,但它的缺点是每个业务类都要对应一个代理类,特别不灵活也不方便,于是就有了动态代理。
动态代理的常见使用场景有RPC框架的封装、AOP(面向切面编程)的实现、JDBC的连接等。
Spring框架中同时使用了两种动态代理JDKProxy和CGLib,当Bean实现了接口时,Spring就会使用JDKProxy,在没有实现接口时就会使用CGLib,我们也可以在配置中指定强制使用CGLib,只需要在Spring配置中添加即可。
本课时我们介绍了JDKProxy和CGLib的区别,JDKProxy是Java语言内置的动态代理,必须要通过实现接口的方式来代理相关的类,而CGLib是三方提供的基于ASM的高效动态代理类,它通过实现被代理类的子类来实现动态代理的功能,因此被代理的类不能使用final修饰。
除了JDKProxy和CGLib之外,我们还讲了Java中常用的工具类Lombok的实现原理,它其实和反射是没有任何关系的;后讲了动态代理的使用场景以及Spring中动态代理的实现方式,希望本文可以帮助到你。
【免责声明】本文系本网编辑部分转载,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及作品内容、版权和其它问题,请在30日内与管理员联系,我们会予以更改或删除相关文章,以保证您的权益!更多内容请加danei0707学习了解。欢迎关注“达内在线”参与分销,赚更多好礼。