当前位置:网站首页>[groovy] compile time metaprogramming (compile time method interception | find the method to be intercepted in the myasttransformation visit method)
[groovy] compile time metaprogramming (compile time method interception | find the method to be intercepted in the myasttransformation visit method)
2022-07-06 00:35:00 【Programmer community】
List of articles
- One 、 stay MyASTTransformation#visit Method to intercept
- 1、 obtain ClassNode Node collection
- 2、 Find the specified ClassNode node
- 3、 Get specified ClassNode Node under MethodNode Node collection
- 4、 Find the specified MethodNode node
One 、 stay MyASTTransformation#visit Method to intercept
stay ASTTransformation Interface implementation class
void visit(ASTNode[] nodes, SourceUnit source)
In the method , among ASTNode[] nodes
Parameter is AST Syntax tree root node array , Each array element is a ModuleNode Corresponding to one Groovy Script ;
SourceUnit source
Is the source unit , You can get the source file through this object ;
source.AST
It's a single ModuleNode object , Corresponding to one Groovy Script ;
1、 obtain ClassNode Node collection
source.AST.classes
It's just one. Groovy The array of class nodes defined in the script ; This is ModuleNode Medium ClassNode Class nodes are encapsulated in List<ClassNode> classes = new LinkedList<ClassNode>();
Among members ;
2、 Find the specified ClassNode node
Use
source.AST.classes.find {
// The search name is Student Class // it yes ClassNode node it.name == "Student" }
Code , You can find the name “Student” Of ClassNode node , That is to say Student Class corresponding node ;
A collection of find The prototype of the method is as follows , What you get is a collection element object ; This method returns the first set element in the set that matches the closure condition ;
/** * Find the first value that matches the closure condition . Example : * <pre class="groovyTestCase">def list = [1,2,3] * assert 2 == list.find { it {@code >} 1 } * </pre> * * @param self a Collection * @param closure a closure condition * @return the first Object found, in the order of the collections iterator, or null if no element matches * @since 1.0 */ public static <T> T find(Collection<T> self, @ClosureParams(FirstParam.FirstGenericType.class) Closure closure) {
BooleanClosureWrapper bcw = new BooleanClosureWrapper(closure); for (T value : self) {
if (bcw.call(value)) {
return value; } } return null; }
3、 Get specified ClassNode Node under MethodNode Node collection
Further , If you get ClassNode Node is not empty , Get MethodNode Node collection , Use ?.methods
Code acquisition ,
source.AST.classes.find {
// The search name is Student Class // it yes ClassNode node it.name == "Student" }?.methods
ClassNode Of getMethods The prototype of the method is as follows :
public class ClassNode extends AnnotatedNode implements Opcodes {
/** * @return Methods related to this {@code ClassNode} */ public List<MethodNode> getMethods() {
if (redirect != null) return redirect.getMethods(); lazyClassInit(); return methodsList; }}
4、 Find the specified MethodNode node
lookup List<MethodNode>
Collection , The name is “hello” The node of , That is to find Student Class hello Method corresponding to MethodNode node ;
source.AST.classes.find {
// The search name is Student Class // it yes ClassNode node it.name == "Student" }?.methods?.find {
// lookup Student The name under the class is hello Methods // it yes MethodNode node it.name == "hello" }
边栏推荐
- Spark DF增加一列
- Key structure of ffmpeg -- AVCodecContext
- Model analysis of establishment time and holding time
- OpenCV经典100题
- LeetCode 6005. The minimum operand to make an array an alternating array
- 电机的简介
- Global and Chinese market of water heater expansion tank 2022-2028: Research Report on technology, participants, trends, market size and share
- PHP determines whether an array contains the value of another array
- OS i/o devices and device controllers
- Extracting profile data from profile measurement
猜你喜欢
Extracting profile data from profile measurement
MYSQL GROUP_ The concat function realizes the content merging of the same ID
Gavin teacher's perception of transformer live class - rasa project actual combat e-commerce retail customer service intelligent business dialogue robot system behavior analysis and project summary (4
[designmode] Decorator Pattern
Spark AQE
LeetCode 1598. Folder operation log collector
Meta AI西雅图研究负责人Luke Zettlemoyer | 万亿参数后,大模型会持续增长吗?
Opencv classic 100 questions
关于slmgr命令的那些事
Arduino hexapod robot
随机推荐
Common API classes and exception systems
How to use the flutter framework to develop and run small programs
Classical concurrency problem: the dining problem of philosophers
Opencv classic 100 questions
STM32按键消抖——入门状态机思维
【DesignMode】适配器模式(adapter pattern)
AtCoder Beginner Contest 254【VP记录】
Notepad + + regular expression replace String
SQLServer连接数据库读取中文乱码问题解决
What is information security? What is included? What is the difference with network security?
MYSQL GROUP_ The concat function realizes the content merging of the same ID
Pointer pointer array, array pointer
Power Query数据格式的转换、拆分合并提取、删除重复项、删除错误、转置与反转、透视和逆透视
The relationship between FPGA internal hardware structure and code
Model analysis of establishment time and holding time
LeetCode 6005. The minimum operand to make an array an alternating array
FFmpeg抓取RTSP图像进行图像分析
An understanding of & array names
小程序容器可以发挥的价值
MDK debug时设置数据实时更新