介绍
JDK动态代理的类必须实现接口,CGLIB可以为没有实现接口的类提供代理
使用
1.被代理类:
public class Coder { public void work() { System.out.println("认真写bug……"); } }
2.拦截器:
public class AttendanceMethodInterceptor implements MethodInterceptor { @Override public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable { System.out.println("上班打卡……"); Object result = proxy.invokeSuper(obj, args); System.out.println("下班打卡……"); return result; } }
实现了MethodInterceptor 接口,重写intercept方法。
在执行invokeSuper()方法前后加增强方法。
3.代理工厂类:
public class CglibProxyFactory { public static Object creatCglibProxyObj(Class<?> clazz) { Enhancer enhancer = new Enhancer(); // 为加强器指定要代理的业务类(即为下面生成的代理类指定父类) enhancer.setSuperclass(clazz); // 设置回调:对于代理类上所有方法的调用,都会调用CallBack,而Callback则需要实现intercept()方法 enhancer.setCallback(new AttendanceMethodInterceptor()); return enhancer.create(); } }
测试:
public class Test { public static void main(String[] args) { Coder coder = (Coder)CglibProxyFactory.creatCglibProxyObj(Coder.class); coder.work(); } }
输出:
原理
运行时在同名包下产生了3个类
1.代理类
继承了被代理对象,重写了被代理对象非final的方法
2.代理类的索引类
3.被代理类的索引类
4.调用顺序
代理类->自定义方法拦截器->代理类索引类getIndex()方法->代理类索引类invoke()方法->代理类->被代理类