在开发Android项目中,经常会用到AbstractProcessor来构建注解处理器。在编译的时候生成代码,从而减少工作量。使用非常广泛的butterknife就是如此,但是最新版的github貌似是使用gradle插件来尽心生成,不过原理应该都类似,编译的时候通过对应的注解生成一些辅助类,或者主动注入一些方法。Groovy的AST就是类似的用法,由于Groovy的动态性,在AST中能做的事情就更多了。
一、AST的简单使用
在intellij中新建一个gradle项目,然后建立两个文件。
ASTtest.groovy
class ASTTextContent {
def a
def fun(){
println 'str'
}
}
println()
TestASTTransformation.groovy
import org.codehaus.groovy.ast.ASTNode
import org.codehaus.groovy.control.SourceUnit
import org.codehaus.groovy.transform.ASTTransformation
import org.codehaus.groovy.transform.GroovyASTTransformation
/*
* Created by TY on 2018/4/20.
*/
@GroovyASTTransformation
class TestASTTransformation implements ASTTransformation {
@Override
void visit(ASTNode[] nodes, SourceUnit source) {
nodes.each {
println it
}
println source.AST
println source.source.reader.text
}
}
接着新建一个META-INF/services目录,在目录下新建一个org.codehaus.groovy.transform.ASTTransformation文件,并在文件中添加下面一行:
TestASTTransformation
最终目录如图:
其中classes,以及resource两个目录可以不管,这是为了方便打包jar建立的目录。按照我之前的建立方式可以不需要额外打包jar来进行测试。
接下来我们运行ASTtest.groovy,就会得到结果:
org.codehaus.groovy.ast.ModuleNode@709ba3fb
org.codehaus.groovy.ast.ModuleNode@709ba3fb
/*
* Created by TY on 2018/4/20.
*/
class ASTTextContent {
def a
def fun(){
println 'str'
}
}
println()
<