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

     

     

  • 相关阅读:
    MySQL (一)(未完成)
    HTML 学习笔记 CSS3 (边框)
    HTML 学习笔记 JavaScript (函数)
    HTML 学习笔记 JavaScript (对象)
    HTML 学习笔记 JavaScript (变量)
    HTML 学习笔记 JavaScript (实现)
    HTML 学习笔记 JavaScript(简介)
    iOS RunTime运行时(1):类与对象
    iOS UITableView 分割线从零开始
    HTML 学习笔记 CSS(选择器4)
  • 原文地址:https://www.cnblogs.com/pmh905001/p/11456150.html
Copyright © 2011-2022 走看看