JDK动态代理必须提供接口才能使用,在一些不能提供接口的环境中,就用CGLIB动态代理。它的优势在于不需要提供接日,只要一个非抽象类就能实现动态代理。 掌握JDK动态代理就很容易掌握CGLIB动态代理,因为它们是相似的,所以你可以先看看源码看源码深入了解JDK动态代理深这篇文章真的比较深,看完再看这篇就很OK
1.编写代理逻辑
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 CglibProxytest implements MethodInterceptor {
/**
* 生成CGLIB代理对象
* @param cls
* @return
*/
public Object getProxy(Class cls){
//CGLIB enhancer增强类对象
Enhancer enhancer=new Enhancer();
//设置代理类
enhancer.setSuperclass(cls);
//定义代理逻辑对象为当前对象 ,对象要继承MethodInterceptor。并实现逻辑方法intercept
enhancer.setCallback(this);
return enhancer.create();
}
/**
* 代理逻辑方法
* @param proxy 代理对象
* @param method 方法
* @param args 方法参数
* @param methodProxy 方法代理
* @return
* @throws Throwable
*/
@Override
public Object intercept(Object proxy, Method method, Object[] args,
MethodProxy methodProxy)throws Throwable
{
System.out.println("调用代理对象前");
Object result=methodProxy.invokeSuper(proxy,args);//真的是代理对象,不像JDk代理,还是真实对象
System.out.println("调用代理对象后");
return result;
}
这里用了CGLIB的加强者Enhancer,通过设置超类的方法setSuperclass,然后通过setCallback方法设置哪个类为它的代理类。其中,参数为this就意味着是当前对象,那就要求用this这个对象实现接口Methodlnterceptor的方法intercept,然后返回代理对象。那么此时当前类的intercept方法就是其代理逻辑方法,其参数内容见代码注解,我们在反射真实对象方法前后进行了打印,CGLIB是通过如下代码完成的。
Object result=methodProxy.invokeSuper(proxy,args);
测试代码
public class Dog {
public void isAnimal()
{
System.out.println("我是动物");
}
}
public class test {
public static void main(String arg[])
{ CglibProxytest cglib=new CglibProxytest();
Dog a=(Dog)cglib.getProxy(Dog.class)
a.isAnimal(); //调用代理对象的isAnimal()方法
}
}
结果:
调用代理对象前
我是动物
调用代理对象后
掌握JDK动态代理就很容易掌握CGLIB动态代理,因为它们是相似的。它们都是用getProxy方法生成代理对象,制定代理的逻辑类。而代理逻辑类要实现一个接口的个方法,那么这个接口定义的方法就是代理对象的逻辑方法,它可以控制真实对象的方法。
原创来源:滴一盘技术