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


目录
相关文章
|
23天前
|
自然语言处理 算法 Python
再谈递归下降解析器:构建一个简单的算术表达式解析器
本文介绍了递归下降解析器的原理与实现,重点讲解了如何使用Python构建一个简单的算术表达式解析器。通过定义文法、实现词法分析器和解析器类,最终实现了对基本算术表达式的解析与计算功能。
93 52
|
1月前
|
JavaScript 前端开发 Java
|
2月前
|
JSON 自然语言处理 前端开发
实操|基于抽象语法树(AST)的代码问题修复
文章介绍了如何通过抽象语法树(AST)技术自动化地解决前端代码治理中的具体问题,特别是针对大量存在的未使用变量或函数参数等问题。
|
4月前
|
JSON JavaScript 前端开发
JS逆向 AST 抽象语法树解析与实践
JS逆向 AST 抽象语法树解析与实践
76 2
|
5月前
|
设计模式 自然语言处理 Java
递归下降解析器的设计与实现
递归下降解析器的设计与实现
|
7月前
|
JavaScript 算法 前端开发
基于抽象语法树+diff算法实现Markdown编译器
基于抽象语法树+diff算法实现Markdown编译器
Thymeleaf ${}中的表达式本质是OGNL-分支与迭代-包含其他模板文件
Thymeleaf ${}中的表达式本质是OGNL-分支与迭代-包含其他模板文件
74 0
|
缓存 自然语言处理 前端开发
【Java原理探索】「编译器专题」重塑认识Java编译器的执行过程(消除数组边界检查+公共子表达式)!
【Java原理探索】「编译器专题」重塑认识Java编译器的执行过程(消除数组边界检查+公共子表达式)!
171 0
【Java原理探索】「编译器专题」重塑认识Java编译器的执行过程(消除数组边界检查+公共子表达式)!
数据结构与算法__08--霍夫曼树二叉树遍历:1.写在节点类中,在上层调用;2.写在主函数中一次性整体完成
霍夫曼树二叉树遍历:1.写在节点类中,在上层调用;2.写在主函数中一次性整体完成
|
Java Maven
【号外】-一款高效的Java源代码解析器
【号外】-一款高效的Java源代码解析器QDox
1810 0
【号外】-一款高效的Java源代码解析器

热门文章

最新文章