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


目录
相关文章
|
6天前
|
自然语言处理 算法 Python
再谈递归下降解析器:构建一个简单的算术表达式解析器
本文介绍了递归下降解析器的原理与实现,重点讲解了如何使用Python构建一个简单的算术表达式解析器。通过定义文法、实现词法分析器和解析器类,最终实现了对基本算术表达式的解析与计算功能。
|
2月前
|
JSON 自然语言处理 前端开发
实操|基于抽象语法树(AST)的代码问题修复
文章介绍了如何通过抽象语法树(AST)技术自动化地解决前端代码治理中的具体问题,特别是针对大量存在的未使用变量或函数参数等问题。
|
4月前
|
JSON JavaScript 前端开发
JS逆向 AST 抽象语法树解析与实践
JS逆向 AST 抽象语法树解析与实践
68 2
|
7月前
LabVIEW使用调用节点与通过引用调用节点调用VI时的差别
LabVIEW使用调用节点与通过引用调用节点调用VI时的差别
113 1
ESM规范如何处理循环依赖的情况
ESM规范如何处理循环依赖的情况
|
缓存 JSON JavaScript
手写node系列之require模块的加载
手写node系列之require模块的加载
128 0
【JavaScript-节点操作】什么是节点,节点操作怎么用,操作节点能干吗?
【JavaScript-节点操作】什么是节点,节点操作怎么用,操作节点能干吗?
183 0
【JavaScript-节点操作】什么是节点,节点操作怎么用,操作节点能干吗?
|
JavaScript 前端开发
JavaScript——作用域和预解析,深度理解代码执行程序
JavaScript——作用域和预解析,深度理解代码执行程序
103 0
JavaScript——作用域和预解析,深度理解代码执行程序
|
Java Maven
【号外】-一款高效的Java源代码解析器
【号外】-一款高效的Java源代码解析器QDox
1801 0
【号外】-一款高效的Java源代码解析器
|
自然语言处理 C++
【Lua篇】静态代码扫描分析(三)语法分析
一、语法分析 通过将词法分析获取的Token流按照目标语言的语法进行解析的过程,例如解析函数声明、函数调用、变量声明、各种语句等。 二、Lua语法分析 在写语法分析程序前,先需要了解Lua的语句和语法,然后进行逐个解析。 下面简单列举一下Lua的语句:
460 0
【Lua篇】静态代码扫描分析(三)语法分析