Groovy编译时元编程 ( 方法拦截时用到的 AST 语法树节点 MethodNode 节点 | MethodNode 节点分析 | MethodNode 节点中的BlockStatement)
Posted 韩曙亮
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 字段 ,
二、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;
三、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<Statement> statements
成员就是方法节点及相关语句 ;
替换 List<Statement> statements
集合中的元素 , 就可以对方法进行拦截 ;
以上是关于Groovy编译时元编程 ( 方法拦截时用到的 AST 语法树节点 MethodNode 节点 | MethodNode 节点分析 | MethodNode 节点中的BlockStatement)的主要内容,如果未能解决你的问题,请参考以下文章
Groovy编译时元编程 ( 编译时方法拦截 | 在 MyASTTransformation#visit 方法中找到要拦截的方法 )
Groovy编译时元编程 ( 编译时元编程引入 | 声明需要编译时处理的类 | 分析 Groovy 类的 AST 语法树 )
Groovy编译时元编程 ( ASTTransformation#visit 方法简介 | org.codehaus.groovy.ast.ModuleNode 脚本节点 )
Groovy编译时元编程 ( 编译时方法注入 | 使用 buildFromSpecbuildFromStringbuildFromCode 进行方法注入 )