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动态生成的代理类需要反编译工具查看,截图已经提供了反编译后的代码。

     

     

  • 相关阅读:
    Unable to load the specified metadata resource
    Web开发人员速查卡
    vs 中大括号之间垂直虚线显示
    第4届华为编程大赛决赛试题解答(棋盘覆盖)
    assert()函数用法总结
    Win7安装VC++6.0已知的兼容性问题的解决方法
    VC6打开一个文件或工程的时候,会导致VC6崩溃而关闭
    浮点数取整.
    1.4 VC6.0在win7下安装的兼容性问题以及解决办法
    华为编程大赛_将字符数组内的数字排序
  • 原文地址:https://www.cnblogs.com/pmh905001/p/11456150.html
Copyright © 2011-2022 走看看