文章目录

  • 一、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 源单元 , 可以通过该对象拿到源文件*/@Overridevoid visit(ASTNode[] nodes, SourceUnit source) {println nodesprintln 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 脚本节点 )相关推荐

  1. 【Groovy】编译时元编程 ( ASTTransformation#visit 方法中访问 Groovy 类、方法、字段、属性 | 完整代码示例及进行编译时处理的编译过程 )

    文章目录 一.ASTTransformation#visit 方法中访问 Groovy 类.方法.字段.属性 二.完整代码示例及进行编译时处理的编译过程 1.Groovy 脚本 Groovy.groo ...

  2. 【Groovy】编译时元编程 ( ASTTransformation#visit 方法获取 Groovy 源文件 )

    文章目录 一.ASTTransformation#visit 方法获取 Groovy 源文件 二.完整代码示例 1.Groovy 脚本 Groovy.groovy 2.ASTTransformatio ...

  3. 【Groovy】Groovy 语言特点简介 ( 支持 Java 语法 | 支持 Java 虚拟机 | Groovy 语言是动态语言 | Groovy 扩展 JDK | 编译时元编程 )

    文章目录 一.Groovy 支持 Java 语法 二.Groovy 支持 Java 虚拟机 三.Groovy 语言是 动态语言 四.Groovy 扩展 JDK 五.Groovy 编译时元编程 一.Gr ...

  4. 【Groovy】编译时元编程 ( 编译时方法拦截 | 在 MyASTTransformation#visit 方法中进行方法拦截 )

    文章目录 一.在 MyASTTransformation#visit 方法中进行方法拦截 二.完整代码示例及进行编译时处理的编译过程 1.Groovy 脚本 Groovy.groovy 2.ASTTr ...

  5. 【Groovy】编译时元编程 ( 编译时方法注入 | 使用 buildFromSpec、buildFromString、buildFromCode 进行方法注入 )

    文章目录 一.在 MyASTTransformation#visit 方法中进行方法注入 1.使用 new AstBuilder().buildFromSpec 进行方法注入 2.使用 new Ast ...

  6. 【Groovy】编译时元编程 ( 方法拦截时用到的 AST 语法树节点 MethodNode 节点 | MethodNode 节点分析 | MethodNode 节点中的BlockStatement)

    文章目录 一.方法拦截时用到的 AST 语法树节点 MethodNode 节点 二.MethodNode 节点分析 三.MethodNode 节点中的 BlockStatement 集合 一.方法拦截 ...

  7. 【Groovy】编译时元编程 ( AST 语法树分析 | ClassNode 根节点 | 方法 Methods 节点 | 字段 Fields 节点 | 属性 Properties 节点 )

    文章目录 一.AST 语法树分析 一.AST 语法树分析 在上一篇博客 [Groovy]编译时元编程 ( 编译时元编程引入 | 声明需要编译时处理的类 | 分析 Groovy 类的 AST 语法树 ) ...

  8. 【Groovy】编译时元编程 ( 编译时元编程引入 | 声明需要编译时处理的类 | 分析 Groovy 类的 AST 语法树 )

    文章目录 一.编译时元编程引入 二.声明需要编译时处理的类 三.分析 Groovy 类的 AST 语法树 一.编译时元编程引入 在之前的 " [Groovy]MOP 元对象协议与元编程 &q ...

  9. 【Groovy】编译时元编程 ( 编译时处理 ASTTransformation 接口实现 | 配置 ASTTransformation )

    文章目录 一.编译时处理 ASTTransformation 接口实现 二.配置 ASTTransformation 一.编译时处理 ASTTransformation 接口实现 声明 ASTTran ...

最新文章

  1. 轻量高效!清华智能计算实验室开源基于PyTorch的视频 (图片) 去模糊框架SimDeblur
  2. Redis操作hash类型
  3. ajax 传递参数中文乱码解决办法
  4. DDR3和eMMC区别
  5. LeetCode 1013. 将数组分成和相等的三个部分
  6. MongoDB 安装配置
  7. LaTeX的历史:图灵奖得主1977年开启的计划,引发学术圈重大变革
  8. hessian无法获取连接_PPPoE拨号设置完成后无法上网解决方法【详解】
  9. c语言 api接口测试工具,Restlet Client插件
  10. laravel 下载文件
  11. (计算圓柱体的体积)编写程序,读入圆柱体的半径和高,并使用下列公式计算圆柱的体积
  12. python图标中文_解决python中matplotlib中文乱码 for Mac
  13. Python爬取煎蛋网图片
  14. 阿里巴巴巨震,堪比地震
  15. 投影仪亚马逊审核标准FCC认证
  16. mysql安装版要选择_mysql 安装版
  17. 我参加了资金盘培训,get了这些“知识点”
  18. 【WLAN】【测试】Linux下aircrack-ng的应用之空口抓包全解
  19. 【基础语法篇】Java必备基础(思维导图+代码)
  20. Mixamo上传自定义模型动画导入Unreal4

热门文章

  1. Freemarker入门小案例(生成静态网页的其中一种方式)
  2. Java多线程-线程的调度(合并)
  3. documentum中的Fulltext search的文章收集
  4. 4.ClassLink - 一种新型的VPC 经典网络的连接方式
  5. 第八届蓝桥杯决赛 磁砖样式
  6. Android SDK更新下载失败以及Studio首次安装取消自动下载SDK
  7. Oracle面试过程中常见的二十个问题
  8. 即时通讯软件设计(一)
  9. [导入]MsAjax Lib- Boolean.parse 函数
  10. 2018-2019-2 网络对抗技术 20165230 Exp9 :Web安全基础