前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【Groovy】编译时元编程 ( 方法拦截时用到的 AST 语法树节点 MethodNode 节点 | MethodNode 节点分析 | MethodNode 节点中的BlockStatement)

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

作者头像
韩曙亮
发布2023-03-30 11:06:51
2720
发布2023-03-30 11:06:51
举报
文章被收录于专栏:韩曙亮的移动开发专栏

文章目录

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


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

代码语言:javascript
复制
class Student{
    def name
    def hello(){
        println "hello"
    }
}

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

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

在这里插入图片描述
在这里插入图片描述

二、MethodNode 节点分析


MethodNode 节点原型如下 :

代码语言:javascript
复制
/**
 * 表示方法声明
 *
 * @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 原型如下 :

代码语言:javascript
复制
/**
 * 语句列表和范围。
 * 
 * @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 集合中的元素 , 就可以对方法进行拦截 ;

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-02-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 文章目录
  • 一、方法拦截时用到的 AST 语法树节点 MethodNode 节点
  • 二、MethodNode 节点分析
  • 三、MethodNode 节点中的 BlockStatement 集合
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档