学习到了很多:
1. 阅读源码的方式
① 站在使用者的角度,从使用到的代码,一步步深入,直到具体的实现,如Retrofit.create(),返回得到接口的实体是动态代理得到的;如IApiService的每个方法调用,返回得到Call/Observable,通过解析方法上的注解,得到HttpServiceMethod$CallAdapted,将OkHttpCall转换得到相应的类型,如Call,调用Call.execute(),内部调用OkHttpCall.execute(),通过OkHttpClient执行真正的网络请求;又如CallAdapter是如何将Call转换成需要的类型的。
② 再找一些我们熟悉的知识点进一步了解原理,如解析注解的过程,如OkHttpCall的内部实现方式,如反序列化的实现。
③ 总结其中使用到的设计模式,查看已经熟悉的设计模式,进一步了解原理,查看不熟悉的设计模式,了解库的实现者是如何利用这种设计模式的。总的来说,还是以我们熟悉的方式去查看源码。
④ 根据需求,可以总结库的优劣势,需要学习到的点,可能会在日常开发中使用到的点,甚至是对库的建议。
2. 某些知识点的了解
① 注解的使用场景。在Retrofit中,注解主要用于业务逻辑的处理。另外还有在Room/Dagger中,注解用于在编译期生成代码,在编译器生成字节码。
② kotlin的原理,编译时修改函数签名,在函数中参数列表末尾添加一个Continutation参数(实际上是一个回调接口)。
③ Gson的实现原理。使用构造器/Unsafe,创建实体或分配实体需要的内存空间,读取json数据,解析类上的注解。
④ 反射、泛型的浅层了解。
另外还有未完全掌握的知识点:
泛型的深入理解,如wildcard,类型擦除所带来的问题与解决方案,特别是运行时。理解signature
Unsafe的使用与原理
反射的深入了解