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


目录
相关文章
|
2月前
|
XML 缓存 JSON
全网最全面介绍淘宝API接口指南
淘宝开放平台提供200+ RESTful API,覆盖商品、交易、物流等核心场景,支持JSON/XML,响应&lt;100ms,成功率≥99.9%。需注册企业账号并获取TOP密钥,不同接口有调用频次限制。提供Python SDK,支持缓存、异步任务与Webhook事件监听。数据精度达98.5%±0.5%,要求AES加密、签名验证与权限隔离,遵循数据合规规范。推荐使用沙箱环境、Postman模板及开源项目加速开发。
802 0
|
11月前
|
JSON Cloud Native API
API 规范和设计
今天主要和大家分享的是如何给予 Open API 3.0 标准来设计一套 API 规范。那么整体我们在讲的过程中,大约有以下五方面。 1. 大环境介绍 2. API与服务开放 3. API定义 4. 模型 5. 总结
1039 5
|
Oracle Java 关系型数据库
EMT4J——让 Java 应用升级更轻松
EMT4J 是什么?如何使用 EMT4J 工具进行 Java 应用升级?
EMT4J——让 Java 应用升级更轻松
|
存储 前端开发 Java
Java后端如何进行文件上传和下载 —— 本地版(文末配绝对能用的源码,超详细,超好用,一看就懂,博主在线解答) 文件如何预览和下载?(超简单教程)
本文详细介绍了在Java后端进行文件上传和下载的实现方法,包括文件上传保存到本地的完整流程、文件下载的代码实现,以及如何处理文件预览、下载大小限制和运行失败的问题,并提供了完整的代码示例。
5194 2
|
缓存 Java Apache
常见的 HTTP 状态码分类及说明
这篇文章介绍了常见的HTTP状态码分类及其说明,包括1xx信息响应、2xx成功、3xx重定向、4xx客户端错误和5xx服务器错误,并提供了一个使用Apache HttpClient进行HTTP POST请求的Java代码示例。
|
SQL 消息中间件 Kafka
Flink报错问题之SQL作业中调用UDTF报错如何解决
Apache Flink是由Apache软件基金会开发的开源流处理框架,其核心是用Java和Scala编写的分布式流数据流引擎。本合集提供有关Apache Flink相关技术、使用技巧和最佳实践的资源。
关于Echarts柱状图监听点击事件的实现方法
关于Echarts柱状图监听点击事件的实现方法
1470 0
|
移动开发 网络协议 数据安全/隐私保护
什么是HTTP隧道,怎么理解HTTP隧道呢?
什么是HTTP隧道,怎么理解HTTP隧道呢?
745 0

热门文章

最新文章