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

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

一、ASTTransformation#visit 方法中访问 Groovy 类、方法、字段、属性


在 ASTTransformation#visit 方法中 , 使用 source.AST 可以获取 Groovy 脚本的 AST 语法树节点 , 该节点是 ModuleNode 类型的 , 在一个 Groovy 脚本中可以定义多个 Class 类 , 其对应的 Class 语法树节点封装在了 ModuleNode 类的 List classes = new LinkedList(); 成员中 ;



因此 , 在 ASTTransformation#visit 方法中 , 可以使用


source.AST.classes


获取 Groovy 脚本中定义的所有 Groovy 类 ;



使用 each 方法遍历上述 Class 类节点集合 List classes , 在闭包中 , 使用 it 获取正在遍历的 ClassNode 类型的集合元素 ;


source.AST.classes.each {
  it 
}



遍历时 , 执行 ClassNode 对象的 visitContents 方法 , 传入 GroovyClassVisitor 对象 , 用于访问 Groovy 的每个类 ;


GroovyClassVisitor 对象中 , 提供了访问 类 、成员字段 、成员方法 、属性 、 构造函数的回调方法 ;



代码示例 :


import org.codehaus.groovy.ast.ASTNode
import org.codehaus.groovy.ast.ClassNode
import org.codehaus.groovy.ast.ConstructorNode
import org.codehaus.groovy.ast.FieldNode
import org.codehaus.groovy.ast.GroovyClassVisitor
import org.codehaus.groovy.ast.MethodNode
import org.codehaus.groovy.ast.PropertyNode
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
        println source.AST
        println source.source.reader.text
        // 获取 Groovy.groovy 脚本中的类集合 , 并进行遍历
        // 在 ModuleNode 中的类节点封装在了如下成员中
        // List<ClassNode> classes = new LinkedList<ClassNode>();
        source.AST.classes.each {
            it.visitContents(new GroovyClassVisitor() {
                @Override
                void visitClass(ClassNode node) {
                    // 分析类的方法
                    println "visitClass ${node.name}"
                }
                @Override
                void visitConstructor(ConstructorNode node) {
                    // 分析类构造方法
                    println "visitConstructor ${node.name}"
                }
                @Override
                void visitMethod(MethodNode node) {
                    // 分析普通方法
                    println "visitMethod ${node.name}"
                }
                @Override
                void visitField(FieldNode node) {
                    // 分析字段
                    println "visitField ${node.name}"
                }
                @Override
                void visitProperty(PropertyNode node) {
                    // 分析属性
                    println "visitProperty ${node.name}"
                }
            })
        }
    }
}


编译时输出结果 :


visitConstructor <init>
visitConstructor <init>
visitMethod main
visitMethod run
visitProperty name
visitField name
visitMethod hello


二、完整代码示例及进行编译时处理的编译过程



1、Groovy 脚本 Groovy.groovy


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


image.png

目录
相关文章
|
程序员 Python
|
5月前
|
机器学习/深度学习 PyTorch 编译器
深入解析torch.compile:提升PyTorch模型性能、高效解决常见问题
PyTorch 2.0推出的`torch.compile`功能为深度学习模型带来了显著的性能优化能力。本文从实用角度出发,详细介绍了`torch.compile`的核心技巧与应用场景,涵盖模型复杂度评估、可编译组件分析、系统化调试策略及性能优化高级技巧等内容。通过解决图断裂、重编译频繁等问题,并结合分布式训练和NCCL通信优化,开发者可以有效提升日常开发效率与模型性能。文章为PyTorch用户提供了全面的指导,助力充分挖掘`torch.compile`的潜力。
504 17
|
5月前
|
机器学习/深度学习 算法 测试技术
DeepSeek-R1-0528:小更新大升级
今天,DeepSeek R1 开源发布了其“小版本”升级——DeepSeek-R1-0528。
609 23
DeepSeek-R1-0528:小更新大升级
|
SQL 缓存 安全
一文浅谈CodeReview中的一些思考
CodeReview在日常的开发过程中越来越被重视,它在提高代码质量同时促进团队成员之间的知识共享和技能提升方面发挥了诸多作用,本文将主要围绕CodeReview展开,简单聊聊在CodeReview过程中的心得和思考。
|
安全 数据安全/隐私保护
ffmpeg的线程安全问题
ffmpeg的线程安全问题
395 0
|
存储 NoSQL Redis
如何修改docker默认数据目录
【7月更文挑战14天】
598 3
|
安全 搜索推荐 数据挖掘
文件解析的终极工具:Apache Tika
文件解析的终极工具:Apache Tika
1886 0
|
机器学习/深度学习 人工智能 自然语言处理
商汤自研的通用Embedding模型Piccolo2
【6月更文挑战第19天】商汤Piccolo2模型**是其新推出的通用Embedding技术,通过多任务混合损失训练提升泛化能力,在CMTEB基准测试中刷新纪录。模型动态调整向量维度与使用MRL方法增强语义理解,但可能增加计算成本,且有观点认为其改进非革命性。[论文链接](https://arxiv.org/abs/2405.06932)
468 1
|
JavaScript
性能工具之 FlameGraph 火焰图
其实很多类似 perf 的工具都能生成火焰图,像 systemtap/dtrace 之类的 并且这个思路,现在在 js 优化、代码优化等各方面都有具体的应用了 至于怎么理解? 简单点说,就是看谁又平又宽
316 7
性能工具之 FlameGraph 火焰图
|
敏捷开发 Java Ruby
groovy下载与安装
groovy下载与安装
323 0