使用
老规矩,先回忆一下怎么使用cglib的动态代理
- 写一个方法拦截器作为回调
- 创建Enhancer并设置父类和回调
- 使用Enhancer创建代理类
public class MyMethodInterceptor implements MethodInterceptor {
@Override
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
System.out.println("proxy前置");
Object o1 = methodProxy.invokeSuper(o, objects);
System.out.println("proxy后置");
return o1;
}
}
@Test
public void test(){
System.setProperty(DebuggingClassWriter.DEBUG_LOCATION_PROPERTY, "D:\\mini-spring-master\\src\\test\\java\\cn\\jwb5\\proxy\\cglib");
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(SayHelloImpl.class);
enhancer.setCallback(new MyMethodInterceptor());
SayHelloImpl sayHello = (SayHelloImpl)enhancer.create();
sayHello.say();
}
原理分析
我们通过设置系统属性DebuggingClassWriter.DEBUG_LOCATION_PROPERTY开启了cglib的debug模式,使其代理文件生成在指定目录
这五个文件,下面两个是库不用管,我们主要看上面三个,依次为:
- 代理类的FastClass
- 代理类
- 目标类的FastClass
FastClass是用来解决反射效率低下的一种方法,这里暂时先不说,后面会讲。我们先看代理类的内容(删掉了大部分其他方法,只留一个用户接口的方法举例说明,其他类似)
public class SayHelloImpl$$EnhancerByCGLIB$$7546f86a extends SayHelloImpl implements Factory {
private boolean CGLIB$BOUND;
public static Object CGLIB$FACTORY_DATA;
private static final ThreadLocal CGLIB$THREAD_CALLBACKS;
private static final Callback[] CGLIB$STATIC_CALLBACKS;
private MethodInterceptor CGLIB$CALLBACK_0;
private static Object CGLIB$CALLBACK_FILTER;
private static final Method CGLIB$say$0$Method;
private static final MethodProxy CGLIB$say$0$Proxy;
private static final Object[] CGLIB$emptyArgs;