【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;
}




目录
相关文章
|
7月前
|
Java Unix 程序员
java 8 新特性讲解Optional类--Fork/Join 框架--新时间日期API--以及接口的新特性和注解
java 8 新特性讲解Optional类--Fork/Join 框架--新时间日期API--以及接口的新特性和注解
93 1
|
4月前
|
Android开发
AS错误:Duplicate class kotlin.xxx.jdk8.DurationConversionsJDK8Kt found in modules kotlin-stdlib-1.8.22
本文描述了Android Studio中遇到的"Duplicate class found in modules"错误的解决方法,通过在`app/build.gradle`文件中使用`constraints`来排除过时的kotlin-stdlib-jdk7和kotlin-stdlib-jdk8依赖,解决了依赖冲突问题。
223 1
|
4月前
|
Java Maven Windows
java -jar 启动 boot 程序 no main manifest attribute, in .\vipsoft-model-web-0.0.1-SNAPSHOT.jar
java -jar 启动 boot 程序 no main manifest attribute, in .\vipsoft-model-web-0.0.1-SNAPSHOT.jar
61 0
|
5月前
|
Java Maven
Class path contains multiple SLF4J bindings,后来找到的解决思路是idea2019.3必须用java11和idea2019.3版本,必须用applicatio
Class path contains multiple SLF4J bindings,后来找到的解决思路是idea2019.3必须用java11和idea2019.3版本,必须用applicatio
|
7月前
|
Rust 编译器
【Rust】——package、crate、定义Module
【Rust】——package、crate、定义Module
|
7月前
|
SQL JSON Java
Java【问题记录 02】对象封装+固定排序+list All elements are null引起的异常处理+Missing artifact com.sun:tools:jar:1.8.0
Java【问题记录 02】对象封装+固定排序+list All elements are null引起的异常处理+Missing artifact com.sun:tools:jar:1.8.0
77 0
|
Java
【Java用法】BeanUtils.populate()的用法
【Java用法】BeanUtils.populate()的用法
109 0
IDEA创建Java9模块没有module-info.java的解决办法
IDEA创建Java9模块没有module-info.java的解决办法
845 0
IDEA创建Java9模块没有module-info.java的解决办法
|
Android开发
【Eclipse】module-info.java报错原因
【Eclipse】module-info.java报错原因
252 0
Scala 运行代码报错: error: object redisson is not a member of package org
Scala 运行代码报错: error: object redisson is not a member of package org
Scala 运行代码报错: error: object redisson is not a member of package org