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

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

image.png


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


image.png



三、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 集合中的元素 , 就可以对方法进行拦截 ;


目录
相关文章
|
1天前
|
安全 数据安全/隐私保护 开发者
解读代码检查规则语言CodeNavi的表达式节点和属性
通过这些内容的详细介绍和实例解析,希望能帮助您深入理解CodeNavi的表达式节点和属性,以及其在代码检查中的实际应用,提高代码质量和开发效率。
22 16
|
2月前
|
自然语言处理 算法 Python
再谈递归下降解析器:构建一个简单的算术表达式解析器
本文介绍了递归下降解析器的原理与实现,重点讲解了如何使用Python构建一个简单的算术表达式解析器。通过定义文法、实现词法分析器和解析器类,最终实现了对基本算术表达式的解析与计算功能。
101 52
|
3月前
|
JSON 自然语言处理 前端开发
实操|基于抽象语法树(AST)的代码问题修复
文章介绍了如何通过抽象语法树(AST)技术自动化地解决前端代码治理中的具体问题,特别是针对大量存在的未使用变量或函数参数等问题。
|
5月前
|
JSON JavaScript 前端开发
JS逆向 AST 抽象语法树解析与实践
JS逆向 AST 抽象语法树解析与实践
83 2
|
8月前
|
JavaScript 算法 前端开发
基于抽象语法树+diff算法实现Markdown编译器
基于抽象语法树+diff算法实现Markdown编译器
|
8月前
|
算法 数据库
10.如何正确编写递归
10.如何正确编写递归
39 0
Thymeleaf ${}中的表达式本质是OGNL-分支与迭代-包含其他模板文件
Thymeleaf ${}中的表达式本质是OGNL-分支与迭代-包含其他模板文件
76 0
|
存储 JSON 缓存
重学Node系列01-模块规范及模块加载机制
Node模块规范及模块加载机制 这是重新阅读《深入浅出NodeJS》的相关笔记,这次阅读发现自己依旧收获很多,而第一次阅读的东西也差不多忘记完了,所以想着这次过一遍脑子,用自己的理解输出一下,方便记忆以及以后回忆... 历史原因,JavaScript以前是没有模块机制的,这对于node来说想要编写一个大型项目是很难的,所以node采用了社区提出的CommmonJS规范 认识CommonJS 这里主要介绍的是大家常见的JavaScript文件模块,其他的将在后续章节介绍
93 0
|
JavaScript 前端开发
JavaScript——作用域和预解析,深度理解代码执行程序
JavaScript——作用域和预解析,深度理解代码执行程序
107 0
JavaScript——作用域和预解析,深度理解代码执行程序
|
开发框架 数据库
GoFrame代码优化:使用gconv类型转换 避免重复定义map
最近一直在研究 GoFrame 框架,经过一段时间的使用、总结、思考,发现确实不失为一款非常值得使用的企业级开发框架。
442 0