0
点赞
收藏
分享

微信扫一扫

cglib底层源码分析(⼆)

其实我们如果看到了cglib所⽣成的代理类之后,其实就不难猜测,cglib是如何去⽣成代理类了,我们看 ⼀个完整的代理类:

 

 

 

 

 

 我们发现,UserService代理类既继承了UserService类,也实现了Factory接⼝,从⽽代理中就需要去 实现Factory接⼝中的⼏个⽅法:

  

 我们可以发现newInstance()⽅法会重新⽣成⼀个代理对象,setCallbacks()和getCallbacks()可以⽤来 设置或获取增强逻辑。

我们还发现,不仅只有test()⽅法会⽣成对应的两个⽅法,其他⽅法也会⽣成,⽐如:

1. equals()

2. toString()

3. hashCode()

4. clone()

对于这些⽅法的实现上篇⽂章已经有所介绍了,所以我们再看⼀下⼀下代理类中还有什么代码是我们不 熟悉的:

 

 

 

 我们发现代理中有很多的属性,仔细阅读可以发现,这些属性中很多都是针对某个⽅法的Method对象 和MethodProxy对象,我们先把equals等所对应的先去掉:

 

 

 代理类中有⼀个代理块,会调⽤CGLIB$STATICHOOK1(),这个⽅法主要就是给属性赋值,⽐如:

1. 构造⼀个ThreadLocal对象给CGLIB$THREAD_CALLBACKS属性

2. 获取UserService类中的test⽅法的Method对象给CGLIB$test$0$Method属性

3. 构造test()⽅法所对应的MethodProxy对象给CGLIB$test$0$Proxy属性

另外,代理类中还有⼀些其他⽅法,但是我看了源码后,发现有⼏个⽅法它只是⽣成了,并没有被调⽤ 到,其中有⼀个⽅法是cglib在⽣成代理对象后,会主动调⽤的⼀个⽅法,这个⽅法是 CGLIB$SET_THREAD_CALLBACKS,我把其他⼏个不⽤的⽅法去掉:

 

 这样,我们就可以更加理解这个代理类了,⼤致流程是:

1. cglib先⽣成代理类

2. 然后调⽤构造⽅法得到代理对象

3. 然后cglib调⽤代理对象的CGLIB$SET_THREAD_CALLBACKS()⽅法,把程序员所设置的 Callbacks设置到CGLIB$THREAD_CALLBACKS这个ThreadLocal中

4. 后续代理对象在执⾏test()⽅法时,就会从CGLIB$THREAD_CALLBACKS拿到所设置的 Callbacks,调⽤其intercept()⽅法

⽽代理类的⽣成逻辑就是:

1. 先⽣成类的定义,实现UserService和Factory接⼝

2. 根据UserService类中的⽅法⽣成代理类中对应的⽅法和属性

3. ⽣成⼀些辅助的属性和⽅法

具体源码就不去分析了,感兴趣的可以⾃⼰花时间去啃了。

⽂章到这⾥,还有还有⼀个点没分析,就是MethodProxy对象,下篇⽂章继续。

举报

相关推荐

0 条评论