文章目录

  • 一、利用注解进行 AST 语法树转换
    • 1、定义注解并使用 GroovyASTTransformationClass 注明 AST 转换接口
    • 2、AST 转换接口实现
    • 3、定义 Groovy 类并使用 @Compile 注解修饰需要拦截的方法
    • 4、执行结果

一、利用注解进行 AST 语法树转换


1、定义注解并使用 GroovyASTTransformationClass 注明 AST 转换接口

首先 , 定义 Compile 注解 , 该注解名称是任意字符串 , @Target(ElementType.METHOD) 表示该注解作用于方法上 , @GroovyASTTransformationClass("MyASTTransformation") 表示该注解修饰的节点对应的 AST 转换接口实现类是 MyASTTransformation ;

import org.codehaus.groovy.transform.GroovyASTTransformationClassimport java.lang.annotation.ElementType
import java.lang.annotation.Target/*** 该注解作用于方法上*/
@Target(ElementType.METHOD)
@GroovyASTTransformationClass("MyASTTransformation")
@interface Compile {}

2、AST 转换接口实现

然后 , 实现 MyASTTransformation 类 , 该类继承 ASTTransformation 接口 ;

import org.codehaus.groovy.ast.ASTNode
import org.codehaus.groovy.ast.builder.AstBuilder
import org.codehaus.groovy.ast.stmt.BlockStatement
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) {// 获取 Groovy.groovy 脚本中的类集合 , 并进行遍历// 在 ModuleNode 中的类节点封装在了如下成员中// List<ClassNode> classes = new LinkedList<ClassNode>();source.AST.classes.find {// 查找名称为 Student 的类// it 是 ClassNode 节点it.name == "Student"}?.methods?.find {// 查找 Student 类下名称为 hello 的方法// it 是 MethodNode 节点it.name == "hello"}?.with {// 找到了 Student 下的 hello 方法// 在 MethodNode 节点下调用// it 就是 MethodNode 节点BlockStatement blockStatement = code// 清空 BlockStatement 中的 List<Statement> statements 成员// 方法拦截清空 , 就不再执行原本的方法// 方法注入不清空 , 会执行原来的方法内容//blockStatement.statements.clear()// 创建方法节点def methods = new AstBuilder().buildFromSpec {expression {methodCall {variable('this')constant('println')argumentList {constant('hello buildFromSpec')}}}}// 将方法节点添加到 hello 方法中//blockStatement.statements.addAll(methods)// 创建方法节点def methods2 = new AstBuilder().buildFromString('println "hello buildFromString"')// 将方法节点添加到 hello 方法中//blockStatement.statements.addAll(methods2)// 创建方法节点, 注意此处拿到的是def methods3 = new AstBuilder().buildFromCode {println "hello buildFromCode"}// 将方法节点添加到 hello 方法中blockStatement.statements.addAll(methods3[0].statements)}}
}

3、定义 Groovy 类并使用 @Compile 注解修饰需要拦截的方法

最后 , 实现 Groovy 类 , 在该类的方法上使用 @Compile 注解 ;

class Student{def name@Compiledef hello(){println "hello"}
}def student = new Student()
student.hello()

4、执行结果

执行上述 Groovy 脚本 , 执行结果为 :

hello
hello buildFromCode

【Groovy】编译时元编程 ( 利用注解进行 AST 语法树转换 | 定义注解并使用 GroovyASTTransformationClass 注明 AST 转换接口 | AST 转换接口实现 )相关推荐

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

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

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

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

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

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

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

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

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

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

  6. 【Groovy】编译时元编程 ( ASTTransformation#visit 方法简介 | org.codehaus.groovy.ast.ModuleNode 脚本节点 )

    文章目录 一.ASTTransformation#visit 方法简介 二.org.codehaus.groovy.ast.ModuleNode 脚本节点 一.ASTTransformation#vi ...

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

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

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

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

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

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

最新文章

  1. 入门 | CNN也能用于NLP任务,一文简述文本分类任务的7个模型
  2. [Windows编程] 通过GetModuleHandleEx 得到函数调用者所在的DLL/EXE
  3. mysqld命令查看数据库目录
  4. 矩阵分析与多元统计1 线性空间与线性变换3 特征值
  5. 计算机应用与网络讲义,计算机基础讲义
  6. Flink-Table StreamTableEnvironment基础知识
  7. hihocoder #1465 : 后缀自动机五·重复旋律8
  8. Android之把app作为独立的module导入其他项目遇到的坑
  9. Capture images using V4L2 on Linux
  10. centos 6.6 mysql5.7_centos6.6 下安装mysql5.7
  11. Latex中定义、定理、引理、证明 设置方法总结
  12. Android5.0 CheckBox颜色修改
  13. 计算机与科学 研究生考试内容,计算机科学与技术考研考哪些科目 备考技巧有哪些...
  14. 文章章节常用序号编排(数字序号顺序)
  15. 刷脸支付打造了一个无卡交易的时代
  16. 横河涡街流量计安装参数说明及要求
  17. 光学雨量计对比翻斗式雨量计的优势
  18. cnpm install 与 npm install
  19. 跨利润中心外协业务生成利润中心结算凭证
  20. 【头部姿态】头部姿态检测(一)

热门文章

  1. 探究chrome下的开发工具的各功能
  2. FineUI(开源版)v4.2.2发布(8年125个版本,官网示例突破300个)!
  3. java.io.CharConversionException: Not an ISO 8859-1 character:
  4. Unable to find the ncurses libraries or the required header files解决
  5. Binary Search O(log n) algorithm to find duplicate in sequential list?
  6. Object_Type列表
  7. 服务器硬盘SAS与SATA区别介绍
  8. 从超链接调用ActionScript
  9. JVM----Java内存区域
  10. CVE-2018-8120 Windows权限提升