cglib 操作字节码的框架
时间: 2023-08-24 16:10:55 浏览: 58
CGLIB(Code Generation Library)是一个基于ASM(Java字节码操作与分析框架)的字节码操作框架。它可以在运行时动态地生成字节码并生成新的类,以实现对类的扩展和增强。
CGLIB主要用于实现代理,尤其是在Spring框架中的AOP(面向切面编程)中经常使用。它可以通过生成子类来实现代理,从而在运行时对目标类进行增强。
CGLIB的核心思想是通过生成目标类的子类来实现代理,子类继承自目标类,因此可以重写目标类的方法,并在方法前后添加额外的逻辑。这种方式相对于JDK动态代理(基于接口)更加灵活,可以代理没有接口的类。
使用CGLIB,我们可以在运行时动态地创建代理类,并通过重写方法来实现对目标类的增强。CGLIB可以操作字节码,对目标类进行修改和扩展,实现方法拦截、属性拦截等功能。
总结来说,CGLIB是一个操作字节码的框架,通过生成子类来实现对目标类的代理和增强,常用于实现AOP功能。
相关问题
cglib动态代理为什么需要创建3份字节码
cglib动态代理在生成代理类时,为了实现对目标类的代理,需要创建三份字节码:
1. Target Class字节码:这是目标类的字节码文件,cglib通过读取目标类的字节码,分析其结构,并生成一个继承目标类的子类。
2. Proxy Class字节码:这是代理类的字节码文件,cglib通过继承目标类的子类生成一个代理类,该代理类会重写目标类中的方法,并在方法内部调用目标类的方法。
3. Enhancer字节码:这是cglib框架生成的一个辅助类,用于生成代理类的代码。Enhancer类包含一些静态方法和成员变量,用于设置代理类的属性和行为。
所以,为了实现动态代理,cglib需要创建这三份字节码文件,其中Target Class字节码和Proxy Class字节码是动态生成的,而Enhancer字节码是固定的。这样就可以通过代理类来调用目标类的方法,并在方法调用前后添加一些额外的逻辑。
Cglib2AopProxy
Cglib2AopProxy 是 Spring AOP 框架中用于实现基于 CGLIB 动态代理的 AOP 代理的类。在 Spring AOP 中,如果目标对象没有实现接口,或者需要代理的方法是 final 方法,则会使用 CGLIB 动态代理来创建代理对象。
Cglib2AopProxy 实现了 Spring AOP 框架中的 AopProxy 接口,它的主要工作是创建 CGLIB 代理对象。在创建代理对象时,Cglib2AopProxy 首先会使用 CGLIB 库创建一个代理类,该代理类继承目标类并实现了指定的接口(如果有),然后将代理类的字节码加载到 JVM 中,并使用反射机制创建代理实例。
Cglib2AopProxy 还实现了 MethodInterceptor 接口,用于拦截目标方法的调用。在拦截方法调用时,Cglib2AopProxy 会根据代理配置中的通知类型(如前置通知、后置通知、环绕通知等)执行相应的通知逻辑,并最终调用目标方法。
需要注意的是,由于 CGLIB 是基于继承的动态代理实现,因此目标类的 final 方法无法被代理。另外,由于 CGLIB 是使用字节码技术生成代理类,因此代理对象的创建和调用可能会比 JDK 动态代理略慢。