关于cglib:CGLIB动态代理底层实现原理
一、前言 最近在探索Spring AOP的性能,发现最初是绕不开JDK动静代理和CGLIB动静代理这两个点。笔者心里大抵有这么个概念:对于动静代理来说,CGLIB性能要好于JDK。也晓得CGLIB是利用ASM技术基于继承子类实现动静代理,JDK是基于实现接口实现动静代理,然而对于底层实现还是比拟含糊。明天就彻底整明确CGLIB动静代理的底层实现。 二、前置筹备(一)测试代码CGLIB外围的几个概念: 被代理对象,本案例【Dog】办法拦截器MethodInterceptor,本案例【CglibMethodInterceptor】Enhance代理对象生成工具,本案例【TestMain测试主类中创立】1. 自定义办法拦截器CglibMethodInterceptor 前面也会将MethodInterceptor说成Callback,其实是一个货色,MethodInterceptor是实现了Callback接口的。 /** * 办法拦截器,不必依赖被代理业务类的援用 */public class CglibMethodInterceptor implements MethodInterceptor { /** * 性能次要是在调用业务类办法之前 之后增加统计工夫的办法逻辑. * intercept 因为具备 MethodProxy methodProxy 参数的起因,不再须要代理类的援用对象了,间接通过 methodProxy 对象拜访被代理对象的办法(这种形式更快)。 * 当然 也能够通过反射机制,通过 method 援用实例 Object result = method.invoke(target, args); 模式反射调用被代理类办法, * target 实例代表被代理类对象援用, 初始化 CglibMethodInterceptor 时候被赋值 。然而Cglib不举荐应用这种形式 * * @param object 代表Cglib 生成的动静代理类 对象自身 * @param method 代理类中被拦挡的接口办法 Method 实例 * @param args 接口办法参数 * @param methodProxy 用于调用父类真正的业务类办法。能够间接调用被代理类接口办法 * @return 被代理类办法执行返回值 * @throws Throwable */ @Override public Object intercept(Object object, Method method, Object[] args, MethodProxy methodProxy) throws Throwable { System.out.println("before"); MonitorUtil.start(); Object result = methodProxy.invokeSuper(object, args);// Object result = methodProxy.invoke(object, args); System.out.println("after"); MonitorUtil.finish(method.getName()); return result; }}2. 被代理类public class Dog { public String call() { System.out.println("wang wang wang"); return "Dog .."; } }3. 切面办法/** * 办法用时监控类,作为一个切面 ,具备两个办法 */public class MonitorUtil { private static final ThreadLocal<Long> tl = new ThreadLocal<>(); public static void start() { tl.set(System.currentTimeMillis()); } /** * 完结时打印耗时 * @param methodName 监控办法名 */ public static void finish(String methodName) { long finishTime = System.currentTimeMillis(); System.out.println(methodName + "办法执行耗时" + (finishTime - tl.get()) + "ms"); }}4. 测试主类public class TestMain { /** * 用于生成 Cglib 动静代理类工具办法 * @param target 代表须要 被代理的 委托类的 Class 对象 * @return 代理类对象 */ public static Object cglibProxyGenerator(Class target) { // 创立增强器,用来创立动静代理类 Enhancer enhancer = new Enhancer(); // 为代理类指定须要代理的类,也即是父类 enhancer.setSuperclass(target); // 设置办法拦截器回调援用,对于代理类上所有办法的调用,都会调用CallBack,而Callback则须要实现intercept() 办法进行拦挡 enhancer.setCallback(new CglibMethodInterceptor()); // 创立cglib 代理类 return enhancer.create(); } public static void main(String[] args) throws ClassNotFoundException { System.setProperty(DebuggingClassWriter.DEBUG_LOCATION_PROPERTY, "classFiles"); Dog poolDog = (Dog) cglibProxyGenerator(Dog.class); poolDog.call(); }}(二)CGLIB生成的子类 Dog$$EnhancerByCGLIB$$beb9d601 ...