其实我们如果看到了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. ⽣成⼀些辅助的属性和⽅法
具体源码就不去分析了,感兴趣的可以⾃⼰花时间去啃了。