Groovy语法学习(十)AST的使用

本文介绍了Groovy的AST(抽象语法树)的使用,包括简单应用、修改方法和绑定注解。通过示例展示了如何在编译时生成代码,减少工作量,以及如何利用AST在运行时动态修改方法。文章还提到了Groovy AST与Java的差异,并预告了接下来将研究Android Gradle插件。
摘要由CSDN通过智能技术生成

在开发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()
<
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值