今天开始梳理以下 java 的底层源码,第一部分打算从 java.lang,这个最基本的包开始。不知道这个系列多久可以完成,但是希望自己可以一直坚持下去。
本来认为,看源码就要把一个类吃透了再吃下一个,但是后来真正阅读的过程之中发现,类和类之间相互交错,想要彻底的将一个类看透对我目前而言过难,所以决定先以广度为主,将代码的大部分功能做初步的了解。
顺带一提,之前自己看openj9的代码,发现很多地方看着步履维艰,很难推进。后来发现是自己的”教材“错了,应当使用openjdk来进行学习。前者是IBM自己”魔改“出来的代码,其并不具有推广java,供很多java 程序员参考的作用;而后者之中的代码是Oracle自己出版,同时也肩负着推广,讲解等等部分的使命,因此应当学习后者。
下面是初步预计的会看的一些基本类和接口:
- Boolean
- Byte
- Character
- Class
- ClassLoader
- Comparable
- Cloneable
- Double
- Enum
- Error
- Exception
- Float
- IndexOutOfBoundException
- Iterable
- Long
- Math
- NullPointerException
- Number
- Object
- Override
- Package
- Process
- Readable
- Runnable
- Runtime
- RuntimeException
- Short
- String
- StringBuffer
- StringBuilder
- Thread
- ThreadLocal
- Throwable
- UnknownError
- Void
Java,lang.reflect:
- Modifier
希望自己可以学到很多。
看到的阅读顺序举例,准备先按照这个试试:
http://www.softtest.com/dev/devtech/16623.html
可能的一种阅读顺序是:
- 基本类型的包装类(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和ThreadLocal
- Math、Random、BigInteger、BigDecimal
- java.lang.reflect下反射的实现(先掌握JDK 9之后引入的模块系统)
- ClassLoader的实现
- javax.lang.model下Java语言模型的实现(可以参考Java官方语法文档)
- 注解(需要彻底掌握)
- Timer、ResourceBundle、Properties
- 时间日期类型(尤其是Java8新增的部分)
- java.lang.reflect.Proxy, JDK默认的动态代理
- java.util.concurrent并发包。先读原子类,再读锁的实现类,最后阅读那些并发工具的实现(很难)
- 集合框架,主要是三大类:List、Set、Map(先读非线程安全的实现,再读线程安全的实现)
- 网络编程(主要阅读Socket通信部分,后续可以阅读HttpClient的实现)
- IO/NIO/BIO(很难)
- Files、Path等文件操作工具类
- sql、xml处理类/接口
- ……