当前位置:网站首页>[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()
边栏推荐
- Codeforces round 804 (Div. 2) [competition record]
- Meta AI西雅图研究负责人Luke Zettlemoyer | 万亿参数后,大模型会持续增长吗?
- 常用API类及异常体系
- 电机的简介
- Spark DF增加一列
- Spark获取DataFrame中列的方式--col,$,column,apply
- Spark AQE
- Reading notes of the beauty of programming
- [noi simulation] Anaid's tree (Mobius inversion, exponential generating function, Ehrlich sieve, virtual tree)
- 图解网络:TCP三次握手背后的原理,为啥两次握手不可以?
猜你喜欢
Free chat robot API
Determinant learning notes (I)
Idea远程提交spark任务到yarn集群
数据分析思维分析方法和业务知识——分析方法(三)
Room cannot create an SQLite connection to verify the queries
Tools to improve work efficiency: the idea of SQL batch generation tools
FFT learning notes (I think it is detailed)
LeetCode 1189. Maximum number of "balloons"
Arduino hexapod robot
2022-02-13 work record -- PHP parsing rich text
随机推荐
常用API类及异常体系
Single source shortest path exercise (I)
如何制作自己的機器人
MYSQL GROUP_ The concat function realizes the content merging of the same ID
如何制作自己的机器人
How spark gets columns in dataframe --column, $, column, apply
【线上小工具】开发过程中会用到的线上小工具合集
STM32按键消抖——入门状态机思维
Solve the problem of reading Chinese garbled code in sqlserver connection database
Common API classes and exception systems
Anconda download + add Tsinghua +tensorflow installation +no module named 'tensorflow' +kernelrestart: restart failed, kernel restart failed
NLP generation model 2017: Why are those in transformer
Arduino hexapod robot
MySQL functions
Multithreading and high concurrency (8) -- summarize AQS shared lock from countdownlatch (punch in for the third anniversary)
MIT博士论文 | 使用神经符号学习的鲁棒可靠智能系统
synchronized 和 ReentrantLock
Arduino六足机器人
Global and Chinese markets of POM plastic gears 2022-2028: Research Report on technology, participants, trends, market size and share
How to make your own robot