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

2、ASTTransformation 接口实现 MyASTTransformation.groovy


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}"
                }
            })
        }
    }
}


3、配置 ASTTransformation


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


MyASTTransformation


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


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@2b175c00]
org.codehaus.groovy.control.SourceUnit@3eb81efb
org.codehaus.groovy.ast.ModuleNode@2b175c00
class Student{
    def name
    def hello(){
        println "hello"
    }
}
def student = new Student()
visitConstructor <init>
visitConstructor <init>
visitMethod main
visitMethod run
visitProperty name
visitField name
visitMethod hello

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





上一篇:基于表格存储的高性能监控数据存储计算方案


下一篇:Redis学习总结--《我的Java打怪日记》