CGLIB
Summary::强大高性能的代码生成库。被广泛应用于 AOP 框架
CGLIB 是一个强大的、高性能的代码生成库。其被广泛应用于 AOP 框架(Spring、dynaopaop)中,用以提供方法拦截操作
为什么使用 CGLIB
CGLIB 代理主要通过对字节码的操作,为对象引入间接级别,以控制对象的访问。我们知道 Java 中有一个动态代理也是做这个事情的,那我们为什么不直接使用 Java 动态代理,而要使用 CGLIB 呢?答案是 CGLIB 相比于 JDK 动态代理更加强大,JDK 动态代理虽然简单易用,但是其有一个致命缺陷是,只能对接口进行代理。如果要代理的类为一个普通类、没有接口,那么 Java 动态代理就没法使用了。200-CGLIB(Code Generation Library) 详解 - CSDN 博客@annote#^sran-1717417057004
CGLIB结构
CGLIB 底层使用了 ASM(一个短小精悍的字节码操作框架)来操作字节码生成新的类。除了 CGLIB 库外,脚本语言(如 Groovy 何 BeanShell)也使用 ASM 生成字节码。ASM 使用类似 SAX 的解析器来实现高性能
原理
Cglib是针对类来实现代理的,他的原理是对代理的目标类生成一个子类,并覆盖其中方法实现增强,因为底层是基于创建被代理类的一个子类,所以它避免了JDK动态代理类的缺陷。
注意
- 由于是继承方式,如果是 static方法,private方法,final方法等描述的方法是不能被代理的
- 由于 CGLIB 的大部分类是直接对 Java 字节码进行操作,这样生成的类会在 Java 的永久堆中。如果动态代理操作过多,容易造成永久堆满,触发 OutOfMemory 异常。
- 做了方法访问优化,使用建立方法索引的方式避免了传统JDK动态代理需要通过Method方法反射调用.
- 提供callback 和filter设计,可以灵活地给不同的方法绑定不同的callback。编码更方便灵活。
- CGLIB会默认代理Object中equals,toString,hashCode,clone等方法。比JDK代理多了clone。