随着项目的成长,我们项目中的build.gradle
文件不断变大,可复用代码越来越多,我们可能需要把这些代码抽取出去,比如上传aar到公司的maven仓库这个功能。又或者我们需要在gradle
编译时做一些自定义的处理,比如动态添加一些类文件。对于这些功能一个自定义的gradle插件完全可以完成。并且复用性很好。所以gradle插件的学习是进阶之路上的必修课。
很多框架在设计时都使用了自定义注解。自定义注解可以让使用者使用方便,同时使用注解还可以降低框架与代码的耦合。 可以参考下面的文章来学习注解
深入理解Java注解类型(@Annotation) : https://blog.csdn.net/javazejian/article/details/71860633
当我们学会使用注解时,我们就需要考虑对于注解的处理我们应该在什么时候? 编译期还是运行时?我们知道对于注解的处理是使用反射的,反射是很耗性能的(正常代码运行速度的十倍)。所有我们对于注解的处理,一般应选择在编译时期。下面我们就来看一下自定义注解处理器:
运行时注解处理器 (直接反射处理注解)
Java中的注解-自定义注解处理器 : https://juejin.im/post/5a6a8ab0f265da3e4b76fc4f
编译时注解处理器 (使用 Annotation Processor)
前面在了解ARouter
和WMRouter
时,发现这两个框架都用到了javapoet
和asm库
。这两个一个是可以产生java源文件的库,一个是可以修改class文件或者产生class文件的库。接下来我们就大概了解一下这两个库的使用。
由square
开源的一个可以生成java源代码的开源工具。API设计的简单易理解。如果我们需要在处理注解时要产生一些java源文件或者我们需要生成一些协议好格式的java源码我们都可以使用这个库。当然生成的都是一些比较简单的java源代码。
我们在使用这个库是尽量不要使用kotlin
来编写 : 首先使用kotlin来编写产生java代码的源文件,同时思考两种代码写法可能有点绕。再者在使用addStatement("$T.out.print", System::class.java)
。这种API时$
会合kotlin产生冲突。
对于这个库API的使用可以参考下面这些文章:
GitHub : https://github.com/square/javapoet
javapoet——让你从重复无聊的代码中解放出来 : https://www.jianshu.com/p/95f12f72f69a
可以从这里拷贝一些模板 : https://juejin.im/entry/58fefebf8d6d810058a610de
ASM 是一个 Java 字节码操控框架。它能被用来动态生成类或者增强既有类的功能。ASM 可以直接产生二进制 class 文件,也可以在类被加载入 Java 虚拟机之前动态改变类行为。
AOP 的利器:ASM 3.0 介绍: https://www.ibm.com/developerworks/cn/java/j-lo-asm30/#N101F3
对于ASM使用的详细介绍可以看ASM4使用指南
, 这是个中译版,对ASM相关API讲解的十分清楚
在看过 java注解
、javapoet
、asm
后,我们做一个练习,写一个类似WMRouter
中ServiceLoader
这样的功能。代码思路基本上是参考ARouter
和WMRouter
的。
代码放在了这里 : https://github.com/SusionSuc/ImplLoader
在写的过程中遇到了不少问题,记录一下 : ImplLoader编写记录