/**
* Cglib生成代理类
*/
public class CglibMeiPo implements MethodInterceptor{
/*
* 生成代理类对象
* cglib动态生成代理类的原理是,
* 1,通过继承生成父类的一个子类,然后这个子类会自己持有父类的引用,
* 2,动态生成时需要把当前的this,传递给代理类,然后这个子类就可以回调下面的intercept方法,
*/
public Object getInstace(Class<?> clz) {
Enhancer enhancer = new Enhancer();
//以被代理类为父类,动态生成它的子类
enhancer.setSuperclass(clz);
//把当前类设置为回调,然后下面的intercept方法就可以执行
enhancer.setCallback(this);
//动态生成代理类的字节码
Object obj = enhancer.create();
return obj;
}
/**
* 动态生成的子类会回调这个方法
*/
public Object intercept(Object obj, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
System.out.println("被代理之前干一些事。。。");
// System.out.println(methodProxy.getClass()+","+obj.getClass()+","+method.getClass());
//obj class com.zl.test.Zhangsan$$EnhancerByCGLIB$$ea35018f的打印可以看出它是Zhangsan 父类的一个子类
// 这里一定要调用父类zhangsan的findLove 方法
methodProxy.invokeSuper(obj, args);
//这个会findLove 方法的递归死循环
// methodProxy.invoke(obj, args);
System.out.println("被代理之后干一些事。。。");
return null;
}
}
测试
public class Test {
public static void main(String[] args) {
//生成的代理类是zhangsan的子类,故可以被父类zhangsan接收
Zhangsan zs = (Zhangsan)new CglibMeiPo().getInstace(Zhangsan.class);
zs.findLove();
//Cglib动态代理的优势是不需要写接口,可以少写一个类,
}
}
测试结果