【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 字段 ,

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


二、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;
}


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



三、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 statements 成员就是方法节点及相关语句 ;


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


上一篇:一分钟了解阿里云产品:弹性伸缩五大热点技术问题分析


下一篇:教你成为字符串连连看高手 | 带你学《Java面向对象编程》之三十二