【Groovy】编译时元编程 ( ASTTransformation#visit 方法简介 | org.codehaus.groovy.ast.ModuleNode 脚本节点 )
文章目录
- 一、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 脚本节点 )相关推荐
- 【Groovy】编译时元编程 ( ASTTransformation#visit 方法中访问 Groovy 类、方法、字段、属性 | 完整代码示例及进行编译时处理的编译过程 )
文章目录 一.ASTTransformation#visit 方法中访问 Groovy 类.方法.字段.属性 二.完整代码示例及进行编译时处理的编译过程 1.Groovy 脚本 Groovy.groo ...
- 【Groovy】编译时元编程 ( ASTTransformation#visit 方法获取 Groovy 源文件 )
文章目录 一.ASTTransformation#visit 方法获取 Groovy 源文件 二.完整代码示例 1.Groovy 脚本 Groovy.groovy 2.ASTTransformatio ...
- 【Groovy】Groovy 语言特点简介 ( 支持 Java 语法 | 支持 Java 虚拟机 | Groovy 语言是动态语言 | Groovy 扩展 JDK | 编译时元编程 )
文章目录 一.Groovy 支持 Java 语法 二.Groovy 支持 Java 虚拟机 三.Groovy 语言是 动态语言 四.Groovy 扩展 JDK 五.Groovy 编译时元编程 一.Gr ...
- 【Groovy】编译时元编程 ( 编译时方法拦截 | 在 MyASTTransformation#visit 方法中进行方法拦截 )
文章目录 一.在 MyASTTransformation#visit 方法中进行方法拦截 二.完整代码示例及进行编译时处理的编译过程 1.Groovy 脚本 Groovy.groovy 2.ASTTr ...
- 【Groovy】编译时元编程 ( 编译时方法注入 | 使用 buildFromSpec、buildFromString、buildFromCode 进行方法注入 )
文章目录 一.在 MyASTTransformation#visit 方法中进行方法注入 1.使用 new AstBuilder().buildFromSpec 进行方法注入 2.使用 new Ast ...
- 【Groovy】编译时元编程 ( 方法拦截时用到的 AST 语法树节点 MethodNode 节点 | MethodNode 节点分析 | MethodNode 节点中的BlockStatement)
文章目录 一.方法拦截时用到的 AST 语法树节点 MethodNode 节点 二.MethodNode 节点分析 三.MethodNode 节点中的 BlockStatement 集合 一.方法拦截 ...
- 【Groovy】编译时元编程 ( AST 语法树分析 | ClassNode 根节点 | 方法 Methods 节点 | 字段 Fields 节点 | 属性 Properties 节点 )
文章目录 一.AST 语法树分析 一.AST 语法树分析 在上一篇博客 [Groovy]编译时元编程 ( 编译时元编程引入 | 声明需要编译时处理的类 | 分析 Groovy 类的 AST 语法树 ) ...
- 【Groovy】编译时元编程 ( 编译时元编程引入 | 声明需要编译时处理的类 | 分析 Groovy 类的 AST 语法树 )
文章目录 一.编译时元编程引入 二.声明需要编译时处理的类 三.分析 Groovy 类的 AST 语法树 一.编译时元编程引入 在之前的 " [Groovy]MOP 元对象协议与元编程 &q ...
- 【Groovy】编译时元编程 ( 编译时处理 ASTTransformation 接口实现 | 配置 ASTTransformation )
文章目录 一.编译时处理 ASTTransformation 接口实现 二.配置 ASTTransformation 一.编译时处理 ASTTransformation 接口实现 声明 ASTTran ...
最新文章
- 轻量高效!清华智能计算实验室开源基于PyTorch的视频 (图片) 去模糊框架SimDeblur
- Redis操作hash类型
- ajax 传递参数中文乱码解决办法
- DDR3和eMMC区别
- LeetCode 1013. 将数组分成和相等的三个部分
- MongoDB 安装配置
- LaTeX的历史:图灵奖得主1977年开启的计划,引发学术圈重大变革
- hessian无法获取连接_PPPoE拨号设置完成后无法上网解决方法【详解】
- c语言 api接口测试工具,Restlet Client插件
- laravel 下载文件
- (计算圓柱体的体积)编写程序,读入圆柱体的半径和高,并使用下列公式计算圆柱的体积
- python图标中文_解决python中matplotlib中文乱码 for Mac
- Python爬取煎蛋网图片
- 阿里巴巴巨震,堪比地震
- 投影仪亚马逊审核标准FCC认证
- mysql安装版要选择_mysql 安装版
- 我参加了资金盘培训,get了这些“知识点”
- 【WLAN】【测试】Linux下aircrack-ng的应用之空口抓包全解
- 【基础语法篇】Java必备基础(思维导图+代码)
- Mixamo上传自定义模型动画导入Unreal4
热门文章
- Freemarker入门小案例(生成静态网页的其中一种方式)
- Java多线程-线程的调度(合并)
- documentum中的Fulltext search的文章收集
- 4.ClassLink - 一种新型的VPC 经典网络的连接方式
- 第八届蓝桥杯决赛 磁砖样式
- Android SDK更新下载失败以及Studio首次安装取消自动下载SDK
- Oracle面试过程中常见的二十个问题
- 即时通讯软件设计(一)
- [导入]MsAjax Lib- Boolean.parse 函数
- 2018-2019-2 网络对抗技术 20165230 Exp9 :Web安全基础