CGLIB
本文最后更新于:2024年4月2日 上午
CGLIB (Code Generation Library) 是一个强大的,高性能,高质量的 Code 生成库,它广泛用于 AOP(面向切面编程)框架,如 Spring,以及 ORM(对象关系映射)框架,如 Hibernate,来在运行时动态生成和扩展 Java 类。它基于 ASM(一个 Java 字节码操纵框架)来转换和操作字节码。
CGLIB 的主要应用之一是提供方法拦截功能,它可以在不修改源码的情况下,增强类的功能。这通常被称作动态代理或装饰器模式的实现。CGLIB 的工作原理可以概括如下:
- 动态生成子类: CGLIB 通过为目标对象的类创建一个子类,来实现对目标对象方法的增强。这个子类会重写父类中所有非 final 的方法。
- 方法拦截: 在子类中重写的方法会首先调用 CGLIB 提供的一个拦截器(MethodInterceptor),这里可以插入自定义的逻辑,比如:方法调用前后的处理逻辑,可以实现 AOP 的各种功能,如日志打印、事务控制等。
- 代码增强: 拦截器中的 intercept 方法提供了 4 个参数:代理对象,被拦截的方法,方法参数和方法代理(MethodProxy)。可以在这个方法里面调用原始方法之前或之后执行额外的操作,也可以完全替代原始方法的执行。
- 实例化增强类: CGLIB 通过 Enhancer 类动态生成增强版的实例。通过调用 Enhancer 的 create() 方法,可以生成代理对象的实例,该实例可以被当作实际业务对象使用。
CGLIB 优点:
- 不需要接口:与 JDK 动态代理相比,CGLIB 不需要代理类实现接口。
- 高性能:生成的代理类性能通常很高。
- 灵活:可以在运行时扩展类及其方法,提供强大的运行时代码增强能力。
CGLIB 缺点:
- 只能代理未被 final 修饰的类和方法。
- 创建代理对象的速度比 JDK 动态代理慢,但执行速度快。
- 更复杂的使用和理解。
CGLIB
https://baymax55.github.io/2024/04/01/java/CGLIB/