当前位置: 首页 > 科技观察

看大牛如何阅读JDK源码,如何获得知识

时间:2023-03-21 12:03:49 科技观察

如何阅读源码,是对每个程序员的挑战。为什么需要阅读源代码?从实践的角度来看,主要有三个目的:第一,解决手头的新问题或新需求;第二,真正理解一些理论的实施;第三,回应采访。端正心态在准备投身阅读源码这门事业之前,首先需要端正自己的心态:阅读源码是一场持久战。显着的效果。阅读源码是锦上添花,不是雪中送炭。如果进入一个新领域,首要任务是阅读文档而不是阅读源代码。阅读源码并不一定能让你成为高手。硕士有专家型和应用型两个方向。无论你的发展倾向哪一方,大量的实操是最根本的保证。阅读源码首先需要理论。比如,你看了Socket通信的代码,却不知道TCP/UDP协议,就像无头鸡乱撞。在这里,我推荐把阅读源码作为一种爱好,就像有的人通过打游戏看直播来放松,有的人通过看新闻看热剧来放松,有的人找朋友吹嘘一下放松一下……不同的人会选择不同的劳逸结合方式。当我不写代码的时候,我更喜欢通过看别人的代码来放松。作为一个Javaer,朝夕相处的JDK自然是你遇到的第一个宝物。从阅读JDK代码开始,可以深入了解Java的一些新旧特性,学习一些设计模式的应用,为以后阅读更大的框架打下扎实的理论基础和顽强的心理基础。选择工具欲做好工作,必先利其器。在开始之前,您需要选择一个源代码阅读工具。在工具选择上,同行的建议很多,我大致分为四类:基于文本的工具(这个分类可能有争议,但这不是重点。。。)比如Nodepad++、EditPlus、UEStudio、Sublime、VsCode、Vim等专家工具如SourceInsight、Understand、OpenGrok(也是很多在线工具的基石)和其他在线工具(几个在线网站已经暂停)如openjdk、SearchCode和其他IDE如eclipse/myeclipse、IDEA等。从个人喜好来说,我推荐使用IDEA和UEStudio(配合UltraFinder)。IDEA作为一款强大的Java生产工具,显然适合阅读Java源码。而UEStudio可以作为临时查看Java文件或者查看JDK中的一些C++代码的选择,配合UltraFinder可以跨文件搜索任意符号,非常实用。阅读环境的搭建可以参考我在https://github.com/kangjianwei/LearningJDK中的描述。阅读顺序JDK项目经历了十几个大版本。算上开源社区的贡献,处理过的人数也可能达到数千人。这么庞大的工程,想一下子看完肯定是不可能的。必须先找到合适的入口,逐个模块完成。一个可能的阅读顺序是:基本类型的包装类(Character放在最后)String,StringBuffer,StringBuilder,StringJoiner,StringTokenizer(补充正则表达式的知识)CharacterIterator,StringCharacterIterator,CharsetProvider,CharsetEncoder,CharsetDecoder(难)java函数.util.function下的表达式java.nio下的各种Buffer实现java.lang.ref和jdk.internal.ref下的各种引用:软引用/弱引用/虚引用的实现Unsafe(JDK9后两个同名类,一个参考了其他的,建议一起看)java.util.stream下流编程的实现(难)Thread和ThreadLocalMath,Random,BigInteger,BigDecimalReflection下java.lang.reflect的实现(先掌握模块系统介绍JDK9之后)javax.lang.model下Java语言模型ClassLoader的实现(可以参考Java官方grammardocument)注释(需要彻底掌握)Timer,ResourceBundle,Propertiestimedatetype(尤其是Java8新增的部分)java.lang.reflect.Proxy,JDK默认的动态代理java.util.concurrent和send包。先读原子类,再读锁的实现类,最后读那些并发工具的实现(难)。实现)网络编程(主要看Socket通信部分,后面可以看HttpClient的实现)IO/NIO/BIO(难)Files、Path等文件操作工具,如sql、xml处理类/接口...注意,这里所说的顺序只是一个大概的方向,并不代表一定要按照这个列表来。在阅读某个代码时,往往会涉及到很多其他代码。这时候会产生很多阅读分支,分支的方向不在上面的列表中。善用技巧阅读代码的技巧因人而异。一千个读者就像一千个哈姆雷特,每个人对这件事的看法都不一样。在这里,我只谈一些个人的经历。理论是第一位的。阅读某个模块时,先寻找其理论支持,甚至先阅读别人的阅读心得,等有了大概的轮廓后再自己实践。一定要试。面对一个新的类,最好先搜索一下它的基本用法,写一个小例子,从这个例子中使用的方法入手来分析这个类。熟练使用调试。IDEA中debug的使用不在本文讨论范围之内。值得注意的是,除了学习常用的运行时调试,还需要学习编译时调试,这在阅读Java语言模型的代码时非常有用。分清主次。类与类之间存在网络结构。阅读某个类时,难免先阅读它引用的其他类。但是,如果它引用的类比较复杂,建议先放着,标记一下,以后再看。但是,如果在读取多个类时,调用链最终指向同一个类,那么这个类就必须先拿下来。生意至上。如果一个类太大,先把里面的方法按照功能分类,梳理出大概的执行流程,然后一个一个攻克。不求深悟。有些方法不需要弄清楚实现过程,只需要了解它的作用即可。比如一些特定领域的算法,对某些规则的分析等等。以点带面。如果你理解了某种方法,你必须搜索该方法的所有应用,验证你的想法是否正确,并在应用的地方写下注释。就算理解有错误也没关系,后面会有新的理解,再批量修改。这种方法也被推荐用于实地阅读和理解。勇于尝试和犯错。很多接口方法的描述都非常抽象,在不同的实现类中含义差异很大。这个时候先理解一个类的实现,然后再用这个类中的理解去解释其他的实现类。如果解释有误,则逐步修复。不要指望一次性能够正确理解某个方法的作用。误解并不能阻止你前进。注意笔记。大多数公共方法都有相应的注解,这是快速理解该方法的重要途径。建议获取谷歌翻译阅读笔记。当然,如果你能流利地阅读英文就更好了。然而,很多时候,批注令人沮丧:看完之后,我完全不知道他在说什么。这也很正常,因为有些评论涉及到很多行业术语或者通用解决方案的描述。如果你之前没有这些理论背景,你可能看不懂评论。原生注解不是万能的,有时候甚至是鸡肋:在你不理解这个方法之前,你并不理解他的注解。当你理解这个方法时,你会觉得这些注解是正确的。因此,我建议注意评论,但不要依赖它们。有时候搜索其他网友的理解结合自己的阅读会更舒服。经常记笔记。如果你有一点灵感,你需要记录下来。最好直接记录在源码的相应位置,能详不能简。毕竟好记性抵不上烂笔头。一步步。当你头脑清醒的时候,打开源码阅读。当你觉得自己看不懂的时候,就不要继续作死了。你应该放下它去做别的事情,或者改天再读。我上完一节课,时间跨度可能有一个多月。这是一个不断补充和完善的过程,不可能一蹴而就。有时候一眼就能看懂,却恰恰错过了关键的理解。这个时候人容易焦虑,急了容易急躁,急躁容易恐慌,恐慌容易乱,乱了容易砸老鼠。所以,一旦觉得遇到了瓶颈,就及时停下来,因为你可能需要放松一下大脑,补充一些缺失的基础理论。