Kartik Shah在自己的Blog上介绍了使用AST Transformation的一些技巧。
他介绍的技巧如下:
- 使用Ast查看器查看AST:虽然Groovy 1.7已经大大简化了AST的创建,但是如果是使用AstBuilder.buildFromSpec,你依旧需要了解Statement/Expression API。写出你要产生的目标代码,然后使用AST查看器观察其结构,之后使用API来复制该结构,可以大大的减轻你的工作。Groovy Console和Eclipse都提供了这样的工具。在Groovy Console中启动它的快捷键是“Ctrl+T”。
- 使用脚本进行观察:拜AstBuilder所赐,我们现在可以很容易的在Groovy Console中使用脚本来产生AST。如果只是想比较产生的和显示的,这种方式最简单,而且非常有用。假设代码如下:
import org.codehaus.groovy.ast.builder.AstBuilder def nodes = new AstBuilder().buildFromCode{ println 1 } - 使用变量的注意事项:如果你使用了一个将会在运行时被替换掉的变量,那么先使用静态值看看它是否能工作。如要产生以下代码:
- 单独编译文件(如果使用IDE):因为Transformation类似一个编织过程,为了避免老的类被调用,最好分别编译Transformation和目标类。
- 使用字节码查看器观察产生的类。
- 通过Testcase了解AstBuilder,使用AstAssert来比较预期和实际。因为AstAssert没有随Groovy 1.7打包,因此要使用它得单独下载。
- 分而治之,一次测试一部分,一步一个脚印。
现在console中运行它,然后键入“ctrl-t”,将弹出以下画面,请留意图中标记出来的部分,这部分对应以上代码的AST。为什么前后会有那么多其他的“噪音”?原因很简单:对于所有Groovy脚本,Groovy都会把它们生成一个类,只有“MethodNode - run”部分才对应你在console中输入的脚本。
def advice = new <<variableClassName>>()
那么,先用一个静态值,如java.lang.String,来产生它,之后再采用比较通用的做法,如其值为用户在标注时指定。
Hamlet D'Arcy在评论中进行了补充:
……AstAssert算不上一个通用的assert方法,所以没有包含在Groovy中。……如果你想用它最好把它包含在你的项目里,因为你可能得要对它进行一些修改。
还有,TranformTestHelper类可以避免类的旧副本问题……
本系列的其余内容:

最新评论
9 周 6 小时之前
9 周 1 天之前
11 周 5 天之前
11 周 5 天之前
17 周 2 天之前
17 周 4 天之前
19 周 3 天之前
20 周 1 天之前
20 周 2 天之前
20 周 5 天之前