cglib动态代理
cglib动态代理 利用asm开源包,对代理对象类的class文件加载进来,通过修改其字节码生成子类它可以在运行期扩展Java类与实现Java接口。可以直接代理类,使用字节码技术,不能对 final类进行继承。使用了动态生成字节码技术。Hibernate用它来实现PO(Persistent Object 持久化对象)字节码的动态生成。
CGLIB是一个强大的高性能的代码生成包。它广泛的被许多AOP的框架使用(以后可能会写一下这方面)
一个普通类
package test;
public class grillChickenWings {
public void grillingChickenWings() {
System.out.println("烤鸡翅ing...");
}
}
自定义MethodInterceptor
public class AdditiveEffect implements MethodInterceptor{
public Object intercept(Object sub, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
System.out.println("Grilling ChickenWings before");
Object object = methodProxy.invokeSuper(sub, objects);
System.out.println("Grilling ChickenWings after");
return object;
}
}
生成CGLIB代理对象调用目标方法:
package test;
import net.sf.cglib.proxy.Enhancer;
public class testCglib {
public static void main(String[] args) {
// TODO Auto-generated method stub
Enhancer enhancer = new Enhancer();
// 设置enhancer对象的父类
enhancer.setSuperclass(grillChickenWings.class);
// 设置enhancer的回调对象
enhancer.setCallback(new AdditiveEffect());
// 创建代理对象
grillChickenWings proxy= (grillChickenWings)enhancer.create();
// 通过代理对象调用目标方法
proxy.grillingChickenWings();
}
}
记得导入 Cglib和asm这两个包(去https://mvnrepository.com找)!!!