当前位置:网站首页>[groovy] compile time meta programming (compile time method interception | method interception in myasttransformation visit method)
[groovy] compile time meta programming (compile time method interception | method interception in myasttransformation visit method)
2022-07-06 00:35:00 【Programmer community】
List of articles
- One 、 stay MyASTTransformation#visit Method interception in method
- Two 、 Complete code examples and the compilation process of compile time processing
- 1、Groovy Script Groovy.groovy
- 2、ASTTransformation Interface implementation MyASTTransformation.groovy
- 3、 To configure ASTTransformation
- 3、 Use the command line for compile time processing
One 、 stay MyASTTransformation#visit Method interception in method
In the last blog 【Groovy】 Compile time metaprogramming ( Compile time method interception | stay MyASTTransformation#visit Method to intercept ) in , stay MyASTTransformation#visit In the method , First of all, I got ModuleNode , Then find the specified ClassNode , From the specified ClassNode Find the corresponding MethodNode node ;
Method interception is mainly in MethodNode Node ; The MethodNode The node corresponding to the Student Class hello Method ;
according to 【Groovy】 Compile time metaprogramming ( Method used in interception AST Syntax tree node MethodNode node | MethodNode Node analysis | MethodNode Nodes in the BlockStatement) Blog analysis , MethodNode The node encapsulates private Statement code;
member , The code The actual type of member is BlockStatement type ;
public class BlockStatement extends Statement
First of all, I will MethodNode Node code Members are assigned to BlockStatement , Is equivalent to Statement Object to BlockStatement type ;
BlockStatement blockStatement = code
stay BlockStatement In the object , Encapsulates the private List<Statement> statements = new ArrayList<Statement>();
member , This is the MethodNode Method content in the node , Empty the collection , It is equivalent to emptying the method body , The method interception operation is implemented ;
Two 、 Complete code examples and the compilation process of compile time processing
1、Groovy Script Groovy.groovy
class Student{
def name def hello(){
println "hello" }}def student = new Student()student.hello()
2、ASTTransformation Interface implementation MyASTTransformation.groovy
import org.codehaus.groovy.ast.ASTNodeimport org.codehaus.groovy.ast.builder.AstBuilderimport org.codehaus.groovy.ast.stmt.BlockStatementimport org.codehaus.groovy.control.SourceUnitimport org.codehaus.groovy.transform.ASTTransformationimport org.codehaus.groovy.transform.GroovyASTTransformation@GroovyASTTransformationclass MyASTTransformation implements ASTTransformation {
/** * Compile time processing * @param nodes AST Abstract syntax tree node , yes ASTNode An array type * @param source Source unit , You can get the source file through this object */ @Override void visit(ASTNode[] nodes, SourceUnit source) {
println nodes println source println source.AST println source.source.reader.text // obtain Groovy.groovy A collection of classes in a script , And traverse // stay ModuleNode The class nodes in are encapsulated in the following members // List<ClassNode> classes = new LinkedList<ClassNode>(); 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" }?.with {
// eureka Student Under the hello Method // stay MethodNode Call under the node // it Namely MethodNode node BlockStatement blockStatement = code // Empty BlockStatement Medium List<Statement> statements member // Method intercepts emptying , No longer execute the original method // Method injection does not empty , Will execute the original method content blockStatement.statements.clear() } }}
3、 To configure ASTTransformation
establish D:\002_Project\012_Groovy\Groovy_Demo\src\main\groovy\resources\META-INF\servicesorg.codehaus.groovy.transform.ASTTransformation
Directory level and documents , Configure... In a file ASTTransformation
The full class name of the implementation class :
MyASTTransformation
3、 Use the command line for compile time processing
First , Get into D:\002_Project\012_Groovy\Groovy_Demo\src\main\groovy
Catalog ,
cd D:\002_Project\012_Groovy\Groovy_Demo\src\main\groovy
then , compile Compile time processing class MyASTTransformation.groovy , The compiled bytecode file MyASTTransformation.class
Save to D:\002_Project\012_Groovy\Groovy_Demo\src\main\groovy\classes
Under the table of contents ,
groovyc -d classes MyASTTransformation.groovy
And then , Package the above compiled bytecode file , Store in D:\002_Project\012_Groovy\Groovy_Demo\src\main\groovy\test.jar
route ;
jar -cf test.jar -C classes . -C resources .
Last , rely on test.jar perform Groovy.groovy Script
groovy -classpath test.jar Groovy.groovy
The execution result is :
[org.codehaus.groovy.ast.ModuleNode@7d7758be]org.codehaus.groovy.control.SourceUnit@2bdd8394org.codehaus.groovy.ast.ModuleNode@7d7758beclass Student{
def name def hello(){
println "hello" }}def student = new Student()student.hello()
边栏推荐
- Key structure of ffmpeg - avframe
- Hudi of data Lake (1): introduction to Hudi
- Spark SQL UDF function
- Leetcode 44 Wildcard matching (2022.02.13)
- [QT] QT uses qjson to generate JSON files and save them
- About the slmgr command
- synchronized 和 ReentrantLock
- Leetcode:20220213 week race (less bugs, top 10% 555)
- 看抖音直播Beyond演唱会有感
- LeetCode 6005. The minimum operand to make an array an alternating array
猜你喜欢
数据分析思维分析方法和业务知识——分析方法(二)
Search (DFS and BFS)
Meta AI西雅图研究负责人Luke Zettlemoyer | 万亿参数后,大模型会持续增长吗?
Comment faire votre propre robot
Recognize the small experiment of extracting and displaying Mel spectrum (observe the difference between different y_axis and x_axis)
Priority queue (heap)
Start from the bottom structure and learn the introduction of fpga---fifo IP core and its key parameters
Determinant learning notes (I)
Idea远程提交spark任务到yarn集群
FFT learning notes (I think it is detailed)
随机推荐
Spark DF增加一列
剖面测量之提取剖面数据
Promise
Set data real-time update during MDK debug
Hudi of data Lake (2): Hudi compilation
Multithreading and high concurrency (8) -- summarize AQS shared lock from countdownlatch (punch in for the third anniversary)
Browser local storage
[Chongqing Guangdong education] Chongqing Engineering Vocational and Technical College
Global and Chinese markets of POM plastic gears 2022-2028: Research Report on technology, participants, trends, market size and share
Date类中日期转成指定字符串出现的问题及解决方法
孤勇者
Meta AI西雅图研究负责人Luke Zettlemoyer | 万亿参数后,大模型会持续增长吗?
The relationship between FPGA internal hardware structure and code
Hudi of data Lake (1): introduction to Hudi
Analysis of the combination of small program technology advantages and industrial Internet
2022.7.5-----leetcode. seven hundred and twenty-nine
[Online gadgets] a collection of online gadgets that will be used in the development process
AtCoder Beginner Contest 258【比赛记录】
Leetcode:20220213 week race (less bugs, top 10% 555)
Data analysis thinking analysis methods and business knowledge - analysis methods (III)