![66680d3a1cfcd1465792b99c6185b75cd9598a5b](https://beijingoptbbs.oss-cn-beijing.aliyuncs.com/cs/5606289-81ea350f8ebee7570ee3ed3b11fee349.png)
今天跟大家分享一下我平时阅读源码的几个小技巧,对于阅读Java中间件如Spring、Dubbo等框架源码的同学有一定帮助。
本文基于Eclipse IDE,我们每天都使用的IDE其实提供了很多强大的功能,掌握它们,往往能够事半功倍。
1、Quick Type Hierarchy 快速查看类继承体系。
快捷键:Ctrl + T
![aeb02f53fc23282fb56073928becd61e03bc5e61](https://beijingoptbbs.oss-cn-beijing.aliyuncs.com/cs/5606289-00db14bc9ab687e8df43dae0605ea076.png)
查看类很多人可能都知道,可源码阅读的时候更多用来查看方法体系更重要,可以方便快速的定位到方法的实现类。如:
![a279ae921617f929237109007c47d2c464a74ad3](https://beijingoptbbs.oss-cn-beijing.aliyuncs.com/cs/5606289-b4d95cbeee315fdef26b924c2f7a5f58.png)
此时如果想查看getBean()方法如何实现,可能会让你失望。结果如下:
![404e310b5a7c3ba90f06a59ba84faddd8e2666d5](https://beijingoptbbs.oss-cn-beijing.aliyuncs.com/cs/5606289-1f6903dc648c7a96f22b446ac2768330.png)
进入到了BeanFactory的接口定义方法,什么也没有。
此时我们直接在getBean上 Ctrl+T :
![24b7684c802d41f31eed7f814e605cfa9ed9b50e](https://beijingoptbbs.oss-cn-beijing.aliyuncs.com/cs/5606289-69c99387a2f67143828e9372f644e479.png)
可以看到其实现的子类,点击子类进去即可。此方法还适用于框架中非常常见的模板方法模式,在抽象类中定义的模板方法,用这招轻松找到实现类。
当然还有详细的Open Type Hierarchy
![da2ecbebabc3cb657ac7a7a3058f6159a56813c8](https://beijingoptbbs.oss-cn-beijing.aliyuncs.com/cs/5606289-f95d0222ed77eccd6668f785772baf9c.png)
会在左侧视图里面展示更好的Type View:
![29e4475ac2e5a5618690d97ac31c89677709da17](https://beijingoptbbs.oss-cn-beijing.aliyuncs.com/cs/5606289-98a1c68b3a2647859598e8515b4d187f.png)
2、Open Call Hierachy 打开调用层级
快捷键:Ctrl+Alt+H
![879b5412c73461ba2243c1c1f52caf072e74cc27](https://beijingoptbbs.oss-cn-beijing.aliyuncs.com/cs/5606289-9cf79b7d60215779602e8b4f490ed660.png)
个人认为这是阅读源码最有用的利器,掌握它,可以轻松游走于各种方法调用之间。然而从我身边的朋友来看, 很多人都不知道他的存在。推荐大家看这篇文章《10个Eclipse珍藏插件推荐》。
Open Call Hierachy 查看结果如下,调用关系清晰明朗,可以直接定位到调用的地方。
![fd3f294b6f7ed38c8e8e3759d41785dc3a6e7f0a](https://beijingoptbbs.oss-cn-beijing.aliyuncs.com/cs/5606289-379d50d0876ac5442e8958e863bb1099.png)
3、Debug 断点的灵活使用
断点调式时,心中必须很清楚F5、F6、F7、F8的作用,不然要么迷失于源码之中,要么什么都没看清就走完了。
重新啰嗦一下它们的作用:
●
F5 Step Into,单步进入。进入到某个方法里面;
●
F6 Step Over,单步结束。一行一行的执行代码,入门时很多人只会一行一行走;
●
F7 Step Return,跳出放发。进入到某个方法里面时,如果发现这个方法没有你想看的东西,或者已经看到了你想看的,直接F7,跳出到方法外;
●
F8 Resume,继续往下执行。往下执行,遇到下一个断点时再停下来,没有则一直运行完。
调试时我们可能会经常遇到loadClass的情况:
![2eefaa481b42047b5e2e2491292bd5b55606b743](https://beijingoptbbs.oss-cn-beijing.aliyuncs.com/cs/5606289-a0ae23ed354ffcb91d52429553e4d53a.png)
在40行想进入ClassPathXmlApplicationContext构造方法,F5不料进入了类加载:
![d19715af2c147603b3dee95c974af704fc8761bd](https://beijingoptbbs.oss-cn-beijing.aliyuncs.com/cs/5606289-1f0596393c4325a4963f8dbd9f402154.png)
熟悉类加载的同学会很熟悉,不熟悉类加载机制的也不要慌,这是说明你调试的类第一次被加载,这时候我们F7跳出类加载,回到40行。
![a7a47b5bc9c1cc552c0685c8771456f99dadfa3b](https://beijingoptbbs.oss-cn-beijing.aliyuncs.com/cs/5606289-fce83f140d1c1e2327cb80f81d4118fc.png)
这个时候再按F5会真正进入ClassPathXmlApplicationContext构造方法。
当我们断点跟踪Spring这种源码的时候,一定要有节奏,以优先找到整体脉络为准,不要一直的F5进入每一行细看,F5下去,几天都走不完Spring。推荐大家看这篇文章《10个Eclipse珍藏插件推荐》。
能熟练在Spring这种框架中F5、F6、F7、F8,就离弄懂他不远了。
Debug的时候还应该注意debug视图的线程栈:
![7361ed6f65f366b4c0b28d745ad85f61489b899f](https://beijingoptbbs.oss-cn-beijing.aliyuncs.com/cs/5606289-0fc27700264a173364907b932f095f6f.png)
这个视图能够让你在走得比较深的时候,可以一眼看出自己怎么进来的,当前位于什么方法里等信息,还可以点击对应的代码行数进入查看。
总结,这是我使用IDE跟踪源码的几个小技巧,尤其是第二点,是很实用的,希望对大家在进行源码跟踪时有一定帮助。
击对
原文发布时间为:2018-11-08
本文作者:徐志毅
本文来自云栖社区合作伙伴“Java技术栈”,了解相关信息可以关注“Java技术栈”。