Groovy编译时元编程 ( 方法拦截时用到的 AST 语法树节点 MethodNode 节点 | MethodNode 节点分析 | MethodNode 节点中的BlockStatement)

Posted 韩曙亮

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Groovy编译时元编程 ( 方法拦截时用到的 AST 语法树节点 MethodNode 节点 | MethodNode 节点分析 | MethodNode 节点中的BlockStatement)相关的知识,希望对你有一定的参考价值。

文章目录





一、方法拦截时用到的 AST 语法树节点 MethodNode 节点



参考 【Groovy】编译时元编程 ( 编译时元编程引入 | 声明需要编译时处理的类 | 分析 Groovy 类的 AST 语法树 ) 三、分析 Groovy 类的 AST 语法树 博客章节 , 分析

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

类的 AST 语法树中的 hello 方法对应的 MethodNode 节点 ;

该 MethodNode 节点信息如下 , 关注该 MethodNode 节点下的 code 字段 ,





二、MethodNode 节点分析



MethodNode 节点原型如下 :

/**
 * 表示方法声明
 *
 * @author <a href="mailto:james@coredevelopers.net">James Strachan</a>
 * @author Hamlet D'Arcy
 * @version $Revision$
 */
public class MethodNode extends AnnotatedNode implements Opcodes 

    public static final String SCRIPT_BODY_METHOD_KEY = "org.codehaus.groovy.ast.MethodNode.isScriptBody";
    private final String name;
    private int modifiers;
    private boolean syntheticPublic;
    private ClassNode returnType;
    private Parameter[] parameters;
    private boolean hasDefaultValue = false;
    private Statement code;
    private boolean dynamicReturnType;
    private VariableScope variableScope;
    private final ClassNode[] exceptions;
    private final boolean staticConstructor;

    // type spec for generics
    private GenericsType[] genericsTypes = null;
    private boolean hasDefault;

    // cached data
    String typeDescriptor;





三、MethodNode 节点中的 BlockStatement 集合



编译时方法拦截需要使用 MethodNode 中的 private Statement code; 成员 , 根据下图 AST 语法树分析

该成员的实际类型是 BlockStatement ;

BlockStatement 原型如下 :

/**
 * 语句列表和范围。
 * 
 * @author <a href="mailto:james@coredevelopers.net">James Strachan</a>
 * @version $Revision$
 */
public class BlockStatement extends Statement 

    private List<Statement> statements = new ArrayList<Statement>();
    private VariableScope scope;

BlockStatement 中的 List<Statement> statements 成员就是方法节点及相关语句 ;

替换 List<Statement> statements 集合中的元素 , 就可以对方法进行拦截 ;

以上是关于Groovy编译时元编程 ( 方法拦截时用到的 AST 语法树节点 MethodNode 节点 | MethodNode 节点分析 | MethodNode 节点中的BlockStatement)的主要内容,如果未能解决你的问题,请参考以下文章

Groovy编译时元编程 ( 编译时方法拦截 | 在 MyASTTransformation#visit 方法中找到要拦截的方法 )

Groovy11_编译时元编程

Groovy11_编译时元编程

Groovy编译时元编程 ( 编译时元编程引入 | 声明需要编译时处理的类 | 分析 Groovy 类的 AST 语法树 )

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

Groovy编译时元编程 ( 编译时方法注入 | 使用 buildFromSpecbuildFromStringbuildFromCode 进行方法注入 )