概念
CGLIB(Code Generation Library)是一个开源项目!是一个强大的,高性能,高质量的Code生成类库,
它可以在运行期扩展Java类与实现Java接口。Hibernate用它来实现PO(Persistent Object 持久化对象)字节码的动态生成。
CGLIB是一个强大的高性能的代码生成包。它广泛的被许多AOP的框架使用,例如Spring AOP为他们提供
方法的interception(拦截)。CGLIB包的底层是通过使用一个小而快的字节码处理框架ASM,来转换字节码并生成新的类。
除了CGLIB包,脚本语言例如Groovy和BeanShell,也是使用ASM来生成java的字节码。当然不鼓励直接使用ASM,
因为它要求你必须对JVM内部结构包括class文件的格式和指令集都很熟悉。
使用案例
package service;
/**
* 被代理类
*/
public class CglibTest {
public void test(){
System.out.println("==测试CGLIB动态代理==");
}
}
import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;
/**
* 拦截器
*/
import java.lang.reflect.Method;
public class MyInterceptor implements MethodInterceptor {
private Object target;
public MyInterceptor(Class clazz) {
Enhancer enhancer = new Enhancer();
// 设置需要创建的子类
enhancer.setSuperclass(clazz);
// 通过字节码技术动态创建子类实例
enhancer.setCallback(this);
this.target = enhancer.create();
}
public Object getTarget(){
return target;
}
/**
*
* @param o 增强的对象
* @param method 被拦截的方法
* @param objects 被拦截方法的参数
* @param methodProxy 触发父类的方法对象
* @return
* @throws Throwable
*/
@Override
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
System.out.println("事务开始。。。");
Object result = methodProxy.invokeSuper(o, objects);
System.out.println("事务结束。。。");
return result;
}
}
import service.CglibTest;
public class MyCglibTest {
public static void main(String[] args) {
// 创建代理对象
MyInterceptor cglib = new MyInterceptor(CglibTest.class);
CglibTest target = (CglibTest)cglib.getTarget();
// 调用目标方法
target.test();
}
}
总结
自定义实现了MethodInterceptor接口的拦截器,重写intercept方法。