当前位置:网站首页>[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()
边栏推荐
- notepad++正则表达式替换字符串
- Set data real-time update during MDK debug
- Leetcode 44 Wildcard matching (2022.02.13)
- 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
- Codeforces gr19 D (think more about why the first-hand value range is 100, JLS yyds)
- LeetCode 6006. Take out the least number of magic beans
- Introduction of motor
- OpenCV经典100题
- [Chongqing Guangdong education] Chongqing Engineering Vocational and Technical College
- 小程序技术优势与产业互联网相结合的分析
猜你喜欢
Comment faire votre propre robot
Extracting profile data from profile measurement
数据分析思维分析方法和业务知识——分析方法(二)
Intranet Security Learning (V) -- domain horizontal: SPN & RDP & Cobalt strike
Model analysis of establishment time and holding time
Notepad + + regular expression replace String
Opencv classic 100 questions
AtCoder Beginner Contest 258【比赛记录】
从底层结构开始学习FPGA----FIFO IP核及其关键参数介绍
How to make your own robot
随机推荐
AtCoder Beginner Contest 258【比赛记录】
Spark DF增加一列
LeetCode 8. String conversion integer (ATOI)
孤勇者
Meta AI西雅图研究负责人Luke Zettlemoyer | 万亿参数后,大模型会持续增长吗?
【DesignMode】装饰者模式(Decorator pattern)
2022.7.5-----leetcode. seven hundred and twenty-nine
Ffmpeg captures RTSP images for image analysis
7.5 decorator
Spark SQL空值Null,NaN判断和处理
Atcoder beginer contest 254 [VP record]
Browser reflow and redraw
Opencv classic 100 questions
SQLServer连接数据库读取中文乱码问题解决
Start from the bottom structure and learn the introduction of fpga---fifo IP core and its key parameters
Free chat robot API
Spark SQL UDF function
AtCoder Beginner Contest 254【VP记录】
MySQL存储引擎
wx. Getlocation (object object) application method, latest version