一、ASTTransformation#visit 方法简介
在上一篇博客 【Groovy】编译时元编程 ( 编译 ASTTransformation | 打包 ASTTransformation 字节码文件 | 编译 Groovy 类同进行编译时处理 ) 中 , 写的进行 Groovy 编译时处理 ASTTransformation 如下 :
import org.codehaus.groovy.ast.ASTNode import org.codehaus.groovy.control.SourceUnit import org.codehaus.groovy.transform.ASTTransformation import org.codehaus.groovy.transform.GroovyASTTransformation @GroovyASTTransformation class MyASTTransformation implements ASTTransformation { /** * 编译时处理方法 * @param nodes AST 抽象语法树节点 , 是 ASTNode 数组类型 * @param source 源单元 , 可以通过该对象拿到源文件 */ @Override void visit(ASTNode[] nodes, SourceUnit source) { println nodes println source } }
打印结果为 :
[org.codehaus.groovy.ast.ModuleNode@2609b277] org.codehaus.groovy.control.SourceUnit@1fd14d74
在 visit 方法中 , ASTNode[] nodes 参数是 AST 语法树根节点 , SourceUnit source 参数代表源码 ;
二、org.codehaus.groovy.ast.ModuleNode 脚本节点
ASTNode[] nodes 参数是 AST 语法树节点 , 该数组的值是
[org.codehaus.groovy.ast.ModuleNode@2609b277]
AST 语法树节点是 org.codehaus.groovy.ast.ModuleNode 类型对象 ;
org.codehaus.groovy.ast.ModuleNode 是 Groovy 脚本的语法树节点 ;
其内部封装的 List classes = new LinkedList(); 成员表示该脚本中定义了多少个 Groovy 类节点 ;
private List methods = new ArrayList(); 成员表示该脚本中有多少个方法 ;
private Map imports = new HashMap(); 成员表示导入了多少类 ;
通过 ModuleNode 类 , 可以拿到 Groovy 脚本中几乎所有的内容 ;
org.codehaus.groovy.ast.ModuleNode 原型如下 :
/** * 表示一个模块,该模块通常由一个类声明组成, * 但可以包括一些导入、一些语句和多个类, * 这些类与Python或Ruby中的脚本等语句混合在一起 * * @author Jochen Theodorou * @author Paul King * @author <a href="mailto:james@coredevelopers.net">James Strachan</a> */ public class ModuleNode extends ASTNode implements Opcodes { private BlockStatement statementBlock = new BlockStatement(); List<ClassNode> classes = new LinkedList<ClassNode>(); private List<MethodNode> methods = new ArrayList<MethodNode>(); private Map<String, ImportNode> imports = new HashMap<String, ImportNode>(); private List<ImportNode> starImports = new ArrayList<ImportNode>(); private Map<String, ImportNode> staticImports = new LinkedHashMap<String, ImportNode>(); private Map<String, ImportNode> staticStarImports = new LinkedHashMap<String, ImportNode>(); private CompileUnit unit; private PackageNode packageNode; private String description; private boolean createClassForStatements = true; private transient SourceUnit context; private boolean importsResolved = false; private ClassNode scriptDummy; private String mainClassName = null; }