java基础篇--动态代理是如何实现的?JDK Proxy 和 CGLib 有什么区别?

90% 的程序员直接或者间接的使用过动态代理,无论是日志框架或 Spring 框架,它们都包含了动态代理的实现代码。动态代理是程序在运行期间动态构建代理对象和动态调用代理方法的一种机制。

我们本课时的面试题是,如何实现动态代理?JDK Proxy 和 CGLib 有什么区别?

典型回答

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

但动态代理不止有反射一种实现方式,例如,动态代理可以通过 CGLib 来实现,而 CGLib 是基于 ASM(一个 Java 字节码操作框架)而非反射实现的。简单来说,动态代理是一种行为方式,而反射或 ASM 只是它的一种实现手段而已。

JDK Proxy 和 CGLib 的区别主要体现在以下几个方面:

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

你可能感兴趣的:(Java源码剖析(30讲),动态代理,CGLIB,JDK,Proxy,静态代理)