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

简介: 【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 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;
}




目录
相关文章
|
关系型数据库 MySQL Linux
【Linux】jdk & Tomcat & MySql的安装及Linux后端接口部署
【Linux】jdk & Tomcat & MySql的安装及Linux后端接口部署
302 0
|
SQL 关系型数据库 Linux
RDS for MySQL权限问题(错误代码:1227,1725)
RDS for MySQL权限问题(错误代码:1227,1725)   1. 错误信息 2. 错误出现的场景 3. 错误原因 4. 解决 4.1 去除 DEFINER 子句 4.2 去除 GTID_PURGED 子句 4.
10224 58
|
关系型数据库 MySQL Linux
Linux7部署 Mysql初始化报错GLIBC_2.28处理
Linux7部署 Mysql初始化报错GLIBC_2.28处理
2354 0
Linux7部署 Mysql初始化报错GLIBC_2.28处理
|
XML Java 数据库连接
MyBatis - 配置多个别名 typeAliasesPackage
MyBatis - 配置多个别名 typeAliasesPackage
1957 0
|
机器学习/深度学习 存储 PyTorch
PyTorch自定义学习率调度器实现指南
本文将详细介绍如何通过扩展PyTorch的 ``` LRScheduler ``` 类来实现一个具有预热阶段的余弦衰减调度器。我们将分五个关键步骤来完成这个过程。
708 2
|
Java 测试技术 持续交付
自动化测试实践:从单元测试到集成测试
【6月更文挑战第28天】-单元测试:聚焦代码最小单元,确保每个函数或模块按预期工作。使用测试框架(如JUnit, unittest),编写覆盖所有功能和边界的测试用例,持续集成确保每次变更后自动测试。 - 集成测试:关注模块间交互,检查协同工作。选择集成策略,编写集成测试用例,模拟真实环境执行测试,整合到CI/CD流程以持续验证软件稳定性。 自动化测试提升软件质量,降低成本,加速开发周期,是现代软件开发不可或缺的部分。
|
缓存 Java Nacos
nacos服务注册问题之容器报错如何解决
Nacos是一个开源的、易于部署的动态服务发现、配置管理和服务管理平台,旨在帮助微服务架构下的应用进行快速配置更新和服务治理;在实际运用中,用户可能会遇到各种报错,本合集将常见的Nacos报错问题进行归纳和解答,以便使用者能够快速定位和解决这些问题。
833 100
|
关系型数据库 分布式数据库 PolarDB
基于PolarDB Ganos的实时时空计算:电子围栏篇
PolarDB是阿里云自主研发的云原生关系型数据库,提供极致弹性、高性能、海量存储及高安全性的数据库服务。PolarDB PostgreSQL版100%兼容PostgreSQL与Oracle语法,集成Ganos云原生时空数据库引擎,支持几何、栅格、轨迹等多种核心功能,实现物理世界时空数据的混合存储与分析。本文介绍的Ganos实时电子围栏计算依托PolarDB PostgreSQL版,展示了其在交通物流、安防、营销等多个领域的应用场景和技术实现细节,包括数据源配置、空间计算函数注册、电子围栏表生成及计算结果存储等步骤。通过Flink实时计算框架,Ganos实现了高效、实时的电子围栏运算
310 0
|
负载均衡 算法 Java
Sharding-JDBC如何实现读写分离
通过以上步骤,Sharding-JDBC能够实现数据库的读写分离,从而提高应用程序的读取性能。欢迎关注威哥爱编程,一起学习成长。
304 0