CGlib是什么
CGlib是一个强大的,高性能,高质量的Code生成类库。它可以在运行期扩展Java类与实现Java接口。
官方介绍:
cglib - Byte Code Generation Library is high level API to generate and transform Java byte code. It is used by AOP, testing, data access frameworks to generate dynamic proxy objects and intercept field access. https://github.com/cglib/cglib/wiki
当然这些实际的功能是ASM所提供的,ASM是一个Java字节码操控框架,官方介绍:
ASM is an all purpose Java bytecode manipulation and analysis
framework. It can be used to modify existing classes or dynamically
generate classes, directly in binary form. Provided common
transformations and analysis algorithms allow to easily assemble
custom complex transformations and code analysis tools.
具体可以去ASM官网详细了解:http://asm.ow2.org/。
cglib封装了ASM,简化了ASM的操作,实现了在运行期动态生成新的class。
Spring aop底层实现就是CGlib;hibernate使用cglib动态生成VO/PO (接口层对象)。
一、JDK中的动态代理
JDK中的动态代理是通过反射类Proxy以及InvocationHandler回调接口实现的,对此不了解的同学可以参考InfoQ上的这篇博客:Java深度历险(七)——Java反射与动态代理
但是JDK中的动态代理有一个缺点:被动态代理的类必须要实现一个接口,也就是说只能对该类所实现接口中定义的方法进行代理,这在实际编程中具有一定的局限性,而且使用反射的效率也并不是很高。
二、CGLib实战
使用CGLib实现动态代理,完全不受代理类必须实现接口的限制,而且CGLib底层采用ASM字节码生成框架,使用字节码技术生成代理类,比使用Java反射效率要高。唯一需要注意的是,CGLib不能对声明为final的类进行代理,因为CGLib原理是动态生成被代理类的子类。
2.1 使用MethodInterceptor实现AOP
1) 首先,代理类UserDao
package com.ricky.cglib;
/**
* 需要被代理的类
* @author Ricky Fung
*
*/
public class UserDao {