树子类遍历父类_Java中的屠龙之术——如何修改语法树?

本文介绍了Java中JCTree与TreeMaker在语法树操作中的应用,包括创建访问标志、类定义、方法定义、变量定义等语法树节点,并通过实战演练展示了如何生成和操作变量、方法、表达式等,帮助读者理解抽象语法树的使用。
摘要由CSDN通过智能技术生成
  • 面试终败“高并发”,25天苦心钻研,居然整出一份并发宝典?
  • 都是“算法”惹的祸,字节三面处处坑,我的offer要凉了?
  • 春招指南之“性能调优”:MySQL+Tomcat+JVM,还怕面试官的轰炸?

JCTree的介绍

JCTree是语法树元素的基类,包含一个重要的字段pos,该字段用于指明当前语法树节点(JCTree)在语法树中的位置,因此我们不能直接用new关键字来创建语法树节点,即使创建了也没有意义。此外,结合访问者模式,将数据结构与数据的处理进行解耦,部分源码如下:

 1public abstract class JCTree implements Tree, Cloneable, DiagnosticPosition { 2 3    public int pos = -1; 4 5    ... 6 7    public abstract void accept(JCTree.Visitor visitor); 8 9    ...10}

我们可以看到JCTree是一个抽象类,这里重点介绍几个JCTree的子类

  1. JCStatement:声明语法树节点,常见的子类如下 JCBlock:语句块语法树节点 JCReturn:return语句语法树节点 JCClassDecl:类定义语法树节点 JCVariableDecl:字段/变量定义语法树节点
  2. JCMethodDecl:方法定义语法树节点
  3. JCModifiers:访问标志语法树节点
  4. JCExpression:表达式语法树节点,常见的子类如下 JCAssign:赋值语句语法树节点 JCIdent:标识符语法树节点,可以是变量,类型,关键字等等
2628c60f78101e605975328ffe735838.png

TreeMaker介绍

TreeMaker用于创建一系列的语法树节点,我们上面说了创建JCTree不能直接使用new关键字来创建,所以Java为我们提供了一个工具,就是TreeMaker,它会在创建时为我们创建的JCTree对象设置pos字段,所以必须使用上下文相关的TreeMaker对象来创建语法树节点。

具体的API介绍可以参照,TreeMakerAPI,接下来着重介绍一下常用的几个方法。

TreeMaker.Modifiers

TreeMaker.Modifiers方法用于创建访问标志语法树节点(JCModifiers),源码如下

 1public JCModifiers Modifiers(long flags) { 2    return Modifiers(flags, List.nil()); 3} 4 5public JCModifiers Modifiers(long flags, 6    List annotations) { 7        JCModifiers tree = new JCModifiers(flags, annotations); 8        boolean noFlags = (flags & (Flags.ModifierFlags | Flags.ANNOTATION)) == 0; 9        tree.pos = (noFlags && annotations.isEmpty()) ? Position.NOPOS : pos;10        return tree;11}
  1. flags:访问标志
  2. annotations:注解列表

其中flags可以使用枚举类com.sun.tools.javac.code.Flags来表示,例如我们可以这样用,就生成了下面的访问标志了。

1treeMaker.Modifiers(Flags.PUBLIC + Flags.STATIC + Flags.FINAL);23public static final

TreeMaker.ClassDef

TreeMaker.ClassDef用于创建类定义语法树节点(JCClassDecl),源码如下:

 1public JCClassDecl ClassDef(JCModifiers mods, 2    Name name, 3    List typarams, 4    JCExpression extending, 5    List implementing, 6    List defs) { 7        JCClassDecl tree = new JCClassDecl(mods, 8                                     name, 9                                     typarams,10                                     extending,11                                     implementing,12                                     defs,13                                     null);14        tree.pos = pos;15        return tree;16}
  1. mods:访问标志,可以通过TreeMaker.Modifiers来创建
  2. name:类名
  3. typarams:泛型参数列表
  4. extending:父类
  5. implementing:实现的接口
  6. defs:类定义的详细语句,包括字段、方法的定义等等

TreeMaker.MethodDef

TreeMaker.MethodDef用于创建方法定义语法树节点(JCMethodDecl),源码如下

 1public JCMethodDecl MethodDef(JCModifiers mods, 2    Name name, 3    JCExpression restype, 4    List typarams, 5    List params, 6    List thrown, 7    JCBlock body, 8    JCExpression defaultValue) { 9        JCMethodDecl tree = new JCMethodDecl(mods,10                                       name,11                                       restype,12                                       typarams,13                                       params,14                                       thrown,15                                       body,16                                       defaultValue,17                
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值