当前位置:网站首页>[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"        }

原网站

版权声明
本文为[Programmer community]所创,转载请带上原文链接,感谢
https://yzsam.com/2022/02/202202140223049756.html