- 面试终败“高并发”,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的子类
- JCStatement:声明语法树节点,常见的子类如下 JCBlock:语句块语法树节点 JCReturn:return语句语法树节点 JCClassDecl:类定义语法树节点 JCVariableDecl:字段/变量定义语法树节点
- JCMethodDecl:方法定义语法树节点
- JCModifiers:访问标志语法树节点
- JCExpression:表达式语法树节点,常见的子类如下 JCAssign:赋值语句语法树节点 JCIdent:标识符语法树节点,可以是变量,类型,关键字等等
![2628c60f78101e605975328ffe735838.png](https://i-blog.csdnimg.cn/blog_migrate/f995d7b7fb2bd34d83e8eee4ad837500.jpeg)
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}
- flags:访问标志
- 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}
- mods:访问标志,可以通过TreeMaker.Modifiers来创建
- name:类名
- typarams:泛型参数列表
- extending:父类
- implementing:实现的接口
- 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