当前位置:网站首页>[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" }
边栏推荐
- How to use the flutter framework to develop and run small programs
- 小程序技术优势与产业互联网相结合的分析
- MySql——CRUD
- 看抖音直播Beyond演唱会有感
- [designmode] adapter pattern
- notepad++正则表达式替换字符串
- STM32 configuration after chip replacement and possible errors
- Idea remotely submits spark tasks to the yarn cluster
- 建立时间和保持时间的模型分析
- 【DesignMode】装饰者模式(Decorator pattern)
猜你喜欢
Go learning - dependency injection
Set data real-time update during MDK debug
如何制作自己的机器人
小程序技术优势与产业互联网相结合的分析
Ffmpeg captures RTSP images for image analysis
Multithreading and high concurrency (8) -- summarize AQS shared lock from countdownlatch (punch in for the third anniversary)
notepad++正则表达式替换字符串
MIT博士论文 | 使用神经符号学习的鲁棒可靠智能系统
Determinant learning notes (I)
Priority queue (heap)
随机推荐
AtCoder Beginner Contest 254【VP记录】
LeetCode 6004. Get operands of 0
JS can really prohibit constant modification this time!
Browser reflow and redraw
How to solve the problems caused by the import process of ecology9.0
《强化学习周刊》第52期:Depth-CUPRL、DistSPECTRL & Double Deep Q-Network
Gd32f4xx UIP protocol stack migration record
猿桌派第三季开播在即,打开出海浪潮下的开发者新视野
notepad++正則錶達式替換字符串
Arduino六足机器人
How to make your own robot
Recognize the small experiment of extracting and displaying Mel spectrum (observe the difference between different y_axis and x_axis)
如何制作自己的機器人
看抖音直播Beyond演唱会有感
Go learning --- read INI file
Browser local storage
Uniapp development, packaged as H5 and deployed to the server
Model analysis of establishment time and holding time
Global and Chinese market of valve institutions 2022-2028: Research Report on technology, participants, trends, market size and share
Global and Chinese markets for hinged watertight doors 2022-2028: Research Report on technology, participants, trends, market size and share