Groovy编译时元编程 ( ASTTransformation#visit 方法简介 | org.codehaus.groovy.ast.ModuleNode 脚本节点 )
Posted 韩曙亮
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Groovy编译时元编程 ( ASTTransformation#visit 方法简介 | org.codehaus.groovy.ast.ModuleNode 脚本节点 )相关的知识,希望对你有一定的参考价值。
文章目录
一、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<ClassNode> classes = new LinkedList<ClassNode>();
成员表示该脚本中定义了多少个 Groovy 类节点 ; private List<MethodNode> methods = new ArrayList<MethodNode>();
成员表示该脚本中有多少个方法 ;private Map<String, ImportNode> imports = new HashMap<String, ImportNode>();
成员表示导入了多少类 ;
通过 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;
以上是关于Groovy编译时元编程 ( ASTTransformation#visit 方法简介 | org.codehaus.groovy.ast.ModuleNode 脚本节点 )的主要内容,如果未能解决你的问题,请参考以下文章
Groovy编译时元编程 ( 编译时方法拦截 | 在 MyASTTransformation#visit 方法中进行方法拦截 )
Groovy编译时元编程 ( 编译 ASTTransformation | 打包 ASTTransformation 字节码文件 | 编译 Groovy 类同进行编译时处理 )
Groovy编译时元编程 ( 编译时方法注入 | 使用 buildFromSpecbuildFromStringbuildFromCode 进行方法注入 )
Groovy编译时元编程 ( 编译时处理 ASTTransformation 接口实现 | 配置 ASTTransformation )