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[]) line: not available

分享图片

 

 
 

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

分享图片

 cglibMethodInterceptor.intercept(Object,MethodProxy) line: 14

分享图片

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

分享图片

 cglibProxyWriter.main(String[]) line: 16

分享图片

 

 

 

 

  

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

相关文章

HashMap是Java中最常用的集合类框架,也是Java语言中非常典型...
在EffectiveJava中的第 36条中建议 用 EnumSet 替代位字段,...
介绍 注解是JDK1.5版本开始引入的一个特性,用于对代码进行说...
介绍 LinkedList同时实现了List接口和Deque接口,也就是说它...
介绍 TreeSet和TreeMap在Java里有着相同的实现,前者仅仅是对...
HashMap为什么线程不安全 put的不安全 由于多线程对HashMap进...