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

举报
韩曙亮 发表于 2022/02/11 00:38:10 2022/02/11
【摘要】 文章目录 一、ASTTransformation#visit 方法获取 Groovy 源文件二、完整代码示例1、Groovy 脚本 Groovy.groovy2、ASTTransformation...





一、ASTTransformation#visit 方法获取 Groovy 源文件



在 ASTTransformation#visit 方法中 , 使用 source.AST 也可以获取 AST 语法树根节点 , 使用 source.source.reader.text 可以和获取 Groovy 类源码的字符串形式 ;

  • AST 语法树根节点 ASTNode[] nodes :
[org.codehaus.groovy.ast.ModuleNode@2609b277]
  • 源码 SourceUnit source :
org.codehaus.groovy.control.SourceUnit@1fd14d74
  • 使用 source.AST 获取 AST 语法树根节点 :
org.codehaus.groovy.ast.ModuleNode@2609b277
  • 使用 source.source.reader.text 获取源码内容 :
class Student{
    def name
    def hello(){
        println "hello"
    }
}

也就是说在 ASTTransformation 中的 visit 方法中 , 可以拿到任何 Groovy 脚本 , Groovy 类 , Groovy 方法 , 字段 , 属性 相关的数据 ;





二、完整代码示例




1、Groovy 脚本 Groovy.groovy


class Student{
    def name
    def hello(){
        println "hello"
    }
}

def student = new Student()

在这里插入图片描述


2、ASTTransformation 接口实现 MyASTTransformation.groovy


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
        println source.AST
        println source.source.reader.text
    }
}

在这里插入图片描述


3、配置 ASTTransformation


创建 Y:\002_WorkSpace\003_IDEA\Groovy_Demo2\src\main\groovy\resources\META-INF\services\org.codehaus.groovy.transform.ASTTransformation 目录层级及文件 , 在文件中配置 ASTTransformation 实现类的全类名 :

MyASTTransformation

在这里插入图片描述


3、使用命令行进行编译时处理


首先 , 进入 Y:\002_WorkSpace\003_IDEA\Groovy_Demo2\src\main\groovy 目录 ,

cd Y:\002_WorkSpace\003_IDEA\Groovy_Demo2\src\main\groovy

然后 , 编译 编译时处理类 MyASTTransformation.groovy , 将编译后的字节码文件 MyASTTransformation.class 保存到 Y:\002_WorkSpace\003_IDEA\Groovy_Demo2\src\main\groovy\classes 目录下 ,

groovyc -d classes MyASTTransformation.groovy

再后 , 打包上述编译好的字节码文件 , 存放在 Y:\002_WorkSpace\003_IDEA\Groovy_Demo2\src\main\groovy\test.jar 路径 ;

jar -cf test.jar -C classes . -C resources .

最后 , 依赖 test.jar 执行 Groovy.groovy 脚本

groovy -classpath test.jar Groovy.groovy

执行结果为 :

[org.codehaus.groovy.ast.ModuleNode@2609b277]
org.codehaus.groovy.control.SourceUnit@1fd14d74
org.codehaus.groovy.ast.ModuleNode@2609b277
class Student{
    def name
    def hello(){
        println "hello"
    }
}

def student = new Student()

在这里插入图片描述

文章来源: hanshuliang.blog.csdn.net,作者:韩曙亮,版权归原作者所有,如需转载,请联系作者。

原文链接:hanshuliang.blog.csdn.net/article/details/122815534

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。