与JDK动态代理相比,使用CGLIB动态代理不需要使用代理的类提供接口
大部分说明在提供的代码里边方便观察
而CGBLIB是第三方的包 使用时需要导入相关的jar包如下
asm-2.2.3,
asm-commons-2.2.3,
asm-util-2.2.3,
cglib-nodep-2.1_3
我刚开始导入的是cglib-3.2.9的jar包 会出现Enhancer创建失败 点到上面的类里面发现实现类的大部分包是没有的 所以cglib依赖以上jar包
CglibProxyProduce 类
import net.sf.cglib.proxy.Enhancer;
public class CglibProxyProduce {
private CglibProxy cglibProxy = new CglibProxy();//需要创建实例
public Object getProxy(Class cls) {
//Enhancer是cglib里面的强化类 这里实例化以调用方法
Enhancer enhancer = new Enhancer();
//设置其超类
enhancer.setSuperclass(cls);
//设置其逻辑代理对象为CglibProxy的实例 注意设置的对象需要实现MethodInterceptor接口
// 接口需要实现intercept方法
// 这里也可以传this值让此类实现MethodInterceptor方法
enhancer.setCallback(cglibProxy);
//返回代理对象
return enhancer.create();
}
实现了接口的CglibProxy类:
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
import java.lang.reflect.Method;
public class CglibProxy implements MethodInterceptor {
@Override
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
System.out.println("调用真实对象前..");
//CGLIB通过反射调用真实对象的方法
//这里的对象o即是要代理的对象
Object result = methodProxy.invokeSuper(o, objects);
System.out.println("调用真实对象后..");
return result;
}
}
使用代理的类:
public class HelloCg {
public void sayHello(String name) {
System.out.println("Hello Cglib"+"--"+name);
}
}
测试类:
public class Cglib_demo {
public static void main(String[] args) {
new Cglib_demo().testCg();;
}
public void testCg() {
CglibProxyProduce cgp = new CglibProxyProduce();
HelloCg helloCg = (HelloCg) cgp.getProxy(HelloCg.class);
//代理后调用方法会通过intercept方法调用
helloCg.sayHello("Unwidom");
}
}
可以看到CGLIB比JDK相比不需要类提供接口 使用更简单一点