zoukankan      html  css  js  c++  java
  • cglib调用过程

    本篇文章不讲cglib如何应用,只从eclipse调试的角度看看从最外层的动态代理类调用到最内层的被代理类,经过了哪些中间步骤。

    废话不多说,直接上代码

    被代理类:

    public class MySubject {
        public void doSomeThing() {
            System.err.println("Do some thing!");
        }    
    }

    拦截器:

    public class CgLibMethodInterceptor implements MethodInterceptor {
    	@Override
    	public Object intercept(Object target, Method method, Object[] args, MethodProxy proxy) throws Throwable {
    		System.err.println("before ");
    		Object result = proxy.invokeSuper(target, args);
    		System.err.println("after " + result);
    		return result;
    	}
    
    } 

    测试cglib动态代理:

    public class CglibProxyWriter {
    	public static void main(String[] args) {
    		System.setProperty(DebuggingClassWriter.DEBUG_LOCATION_PROPERTY, "D:\cglib-class\");
    		MySubject subject= (MySubject) Enhancer.create(MySubject.class,new CgLibMethodInterceptor());		
    		subject.doSomeThing();
    	}
    }
    

     

    从调用栈可以清晰的看到最外层到最内层的调用逻辑。

    MySubject$$EnhancerByCGLIB$$24226c3c(MySubject).doSomeThing() line: 6
    MySubject$$EnhancerByCGLIB$$24226c3c.CGLIB$doSomeThing$0() line: not available
    MySubject$$EnhancerByCGLIB$$24226c3c$$FastClassByCGLIB$$a7941ac2.invoke(int, Object, Object[]) line: not available
    MethodProxy.invokeSuper(Object, Object[]) line: 244
    CgLibMethodInterceptor.intercept(Object, Method, Object[], MethodProxy) line: 14
    MySubject$$EnhancerByCGLIB$$24226c3c.doSomeThing() line: not available
    CglibProxyWriter.main(String[]) line: 16

    MySubject$$EnhancerByCGLIB$$24226c3c(MySubject).doSomeThing() line: 6
    
    

     MySubject$$EnhancerByCGLIB$$24226c3c.CGLIB$doSomeThing$0() line: not available 

     

    MySubject$$EnhancerByCGLIB$$24226c3c$$FastClassByCGLIB$$a7941ac2.invoke(int, Object, Object[]) line: not available
    
    

     MethodProxy.invokeSuper(Object, Object[]) line: 244

     CgLibMethodInterceptor.intercept(Object, Method, Object[], MethodProxy) line: 14

    MySubject$$EnhancerByCGLIB$$24226c3c.doSomeThing() line: not available

     CglibProxyWriter.main(String[]) line: 16

     

      

    eclipse调试的时候不能加上断点,cglib动态生成的代理类需要反编译工具查看,截图已经提供了反编译后的代码。

     

     

  • 相关阅读:
    P1030 求先序排列 P1305 新二叉树
    spfa
    Clairewd’s message ekmp
    Cyclic Nacklace hdu3746 kmp 最小循环节
    P1233 木棍加工 dp LIS
    P1052 过河 线性dp 路径压缩
    Best Reward 拓展kmp
    Period kmp
    Substrings kmp
    Count the string kmp
  • 原文地址:https://www.cnblogs.com/pmh905001/p/11456150.html
Copyright © 2011-2022 走看看